TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
Sturts2漏洞百出,可谓是年年都会爆发一次或大或小的风波,但是即使这样,Sturts2还是有一批用户的。1 {- d& E1 C. a0 ]
花费十几分钟,简单的搭建实现了一下基本的登录功能。都是入门级的,高手肯定是不屑了,但是对于初次涉猎的小白们,还是可以提供点参考的。
2 ?6 d. }7 R/ N) x$ D* X: N/ N0 Q/ _" R# B/ S
注意:& U! q# k! C: Z% t H
0)项目Demo可以正常运行并经过测试# R. X# B% y2 ?" ^( E8 X( L6 L
1)代码是伪代码,自行添加逻辑
0 V4 x% ?- f$ x% `2)struts2-2.5.10 加入了Action验证,注意 struts.xml 中的 <global-allowed-methods>regex:.*</global-allowed-methods>8 a0 D. h3 {. k1 q2 i" Q
3)struts2-2.5.10 拦截器修改了路径,注意web.xml中的配置
8 D9 K+ c, w: ?4 s4)本案例,返回采用json数据的形式,使用struts2-json-plugin-2.3.20.jar,json配置见struts.xml 全局配置。
) \/ |3 l* B! O* L9 K+ M+ P! ?: T2 [8 A7 ?
一、项目搭建(使用最新版本struts2-core-2.5.10)
( J. J' _9 W1 e' ~5 Q3 B/ g" n: P/ W$ M. N2 l
1、相关JAR' [9 I9 U6 B: |
commons-fileupload-1.3.2.jar4 j% N6 }" O8 k. Z, Y
commons-io-2.4.jar
) f. N" v1 f+ H; \5 [commons-lang3-3.4.jar
8 @( R3 B; I+ ^6 C; H: ]6 c, d: ]commons-logging-1.2.jar
" A [9 X9 t8 {+ @freemarker-2.3.23.jar$ z: `3 D+ v3 s' D' ^" G( ?, O8 c
javassist-3.20.0-GA.jar
$ U' y: Z' T' B5 I9 h# Slog4j-api-2.7.jar
, {) [+ I# {: O4 P7 vlog4j-core-2.7.jar
* M k* _/ Z d c- S2 w nognl-3.1.12.jar5 S( F9 p' K# y/ |0 T* X2 m8 c9 _
struts2-core-2.5.10.jar# z8 e g4 f) C8 [/ Q8 j: B+ a5 Y
struts2-json-plugin-2.3.20.jar
+ R1 D3 x: k7 S* t0 ~xwork-core-2.3.31.jar# [1 [* L: z( f" l" y
* r V( n! @1 i! C9 u: D# i2、前端框架! f$ M- K5 H5 P2 F
Jqueryjquery-1.10.2.min.js
7 `8 w6 u }$ bbootstrap.min.js A5 @* I Q" d/ T
7 S: h3 P! y2 T3、相关配置: H/ Q) b7 {1 K% K2 U; a9 j$ e6 Q- A
web.xml5 @) N7 |# L9 N5 Z; H
- <?xml version="1.0" encoding="UTF-8"?>/ ?2 \* {: ^3 |9 I4 i
- <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5" >7 z2 k& `' k1 M+ \% M0 N0 L
- <display-name>struts2</display-name>
4 [1 N2 S) x; I2 z7 b b1 X$ U - <!-- struts2配置 -->
, O9 W5 R: A5 k; T) n$ Y - <filter>
4 J, P6 o5 h6 \ - <filter-name>struts2</filter-name>
$ I3 W- _4 @9 p# l% V - <filter-class>& {! X$ I- L+ s1 r
- org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter
$ j3 v3 D7 G. E. z \, h! K - </filter-class>/ m1 c4 u7 f# [" U. l1 W, f$ s
- </filter>7 f: F; S q4 p5 ~: O
- <filter-mapping>
, @# E" j; p5 Q U) _7 Z) a - <filter-name>struts2</filter-name>5 i; l: y$ e% r1 [; x
- <url-pattern>/*</url-pattern>8 @; Y! b) p; P6 _ v% _7 a: {1 }
- </filter-mapping>5 M: ]3 t" O% ~
- <welcome-file-list>$ e0 J& w- [6 \# s; B
- <welcome-file>login.jsp</welcome-file>+ Z( L" q* A! O& B2 M! }
- </welcome-file-list>
: u" L& o! I% i - </web-a
复制代码 5 g$ s3 ?$ a+ I: f
struts.xml
" Z. _; E2 A5 I' ^% e. ^9 B- <?xml version="1.0" encoding="UTF-8" ?>
/ E8 V& m# O7 B: v0 E0 i5 z" k' D - <!DOCTYPE struts PUBLIC
' G: S" F. [0 E! P8 E - "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
" b( f6 Q8 I! ^6 B$ d - "http://struts.apache.org/dtds/struts-2.5.dtd">+ w. X) b- Y3 d$ x
- <struts>
& J7 u2 a# P+ K- Z5 @: B - <!-- struts配置文件改动后,是否重新加载 -->* h/ N6 I9 s7 X. t v2 b4 G. K3 x0 x
- <constant name="struts.configuration.xml.reload" value="true" />
; X! a. c/ T, i; I# Y/ O: p - <!-- 开发模式 开启它则默认开启了i18n.reload、configuration.xml.reload 上线后要关闭此选项 -->: o* I" H7 k& ~$ E. `# b/ k' l
- <constant name="struts.devMode" value="false" />+ z4 u, N9 i- _# k7 h7 I# ]
- <constant name="struts.i18n.encoding" value="UTF-8"/>2 t5 H; g$ N+ K6 j/ _
- <constant name="struts.multipart.maxSize" value="1073741824"/><!-- 上传文件最大值 -->9 Y' {+ M# _, R2 y3 q. K
- <constant name="struts.custom.i18n.resources" value="config" />
6 n/ O- ^- [( f$ q4 o. L - <constant name="struts.action.extension" value="action"/>. O# T& D I- e R
- <package name="struts-global" extends="json-default">9 L+ N2 p; i' c, C/ ?% r( W/ H) a
- <!-- 配置Json输出 配合使用 struts2-json-plugin-2.3.20.jar 后台配置 message -->$ I) A, s# `% i. z3 a! w/ G
- <global-results> ( V# C3 O" h/ N
- <result type="json">
4 L3 z1 R: I- L( M( B/ } - <param name="root">message</param>$ P! D( |/ a2 y' E' L7 d. B( ?
- </result>
5 m+ l! t3 j$ F, t! {; x& ? - </global-results>+ V6 m3 P+ i* X9 `% N+ o" I
- <!-- 2.5.10版本 匹配 -->
5 s- J' @% Z& s0 l- }8 V% `" }& Y - <global-allowed-methods>regex:.*</global-allowed-methods>
3 T1 v$ S. V/ r! Q - </package>' l: {/ G6 ]* n: G& e1 r1 p4 ?
- <package name="user" extends="struts-global">
/ _! y& C* v: x6 d: w- [& V - <action name="userAction_*" class="com.itstyle.web.user.UserAction" method="{1}">
/ t R( D$ L' R* a0 R5 f/ w( g1 j - <result name="logout">/login.jsp</result>
3 J7 s r8 Q6 q - </action>
5 p2 h* S( f/ R9 k' p - </package>4 W1 n6 }+ j: [
- </struts>
6 c g# X/ n9 E4 N. g: ?; \ - 9 p5 `8 d. N+ a2 v, j
复制代码 ( H' W$ `( j1 c w+ b( N
+ F3 M. F' f: e6 v eUserAction
. h1 l3 r* U' U2 ^3 _" X- package com.itstyle.web.user;7 a2 y) T! S- Y
- $ N9 c) J& m I' S" E
- import com.opensymphony.xwork2.ActionSupport;
4 B5 g/ }1 `0 P+ T' G, Z - /**
8 Y- U; v5 E# v7 X$ W - * : O2 R+ g5 @# C
- * @author 科帮网; r; j2 E. X. P, o/ n; _2 y# W
- *
8 z, w0 c6 b2 \$ O - */
- P5 Q2 N& [% F/ f B5 ? - public class UserAction extends ActionSupport {: j- l7 A& f) a
- private static final long serialVersionUID = 1L;% c+ f" V' q4 @# D
- private String message;
4 x4 ]- q) j9 \/ u - private String userName;8 g) B# F3 t6 w3 A; y# W; A
- private String password;
$ X" k1 _2 B1 U: b - 1 M) A! o9 [/ J C9 W/ y/ X
- public String login(){4 q' c E) |/ O
- if("admin".equals(userName)&&"admin".equals(password)){9 j6 |) i2 h+ {8 F
- message = "0";
* \( d: Z: `2 J1 Q - }else{
o5 B9 X+ b1 J0 k9 I - message = "1";$ z2 r1 M- y+ r4 }6 Z
- }
: O/ T# \$ p! Y+ _' e - return SUCCESS;! p9 \% i3 V, l+ K2 o* ]0 G* l4 x
- }/ F8 X8 _2 N9 n# Z$ n: e. c
- 0 D. Q" X6 }9 b4 A0 P# a+ Q
- public void setMessage(String message) {
0 ?( A- f% }* H - this.message = message;
9 [, l+ x2 I' ~( D" V - }$ |5 m; W6 e9 j; O
- public String getMessage() {- W# }( e( Q% `7 u F: k
- return message;
- H- l& i1 c9 N2 `# d* Q - }
7 A; R% I7 F( f% f/ u: k8 c - ' x( P( P, H% {# N; d+ I5 O0 Z. V1 M
- public void setUserName(String userName) {9 [/ P2 ~& M, V7 u6 a. O
- this.userName = userName;0 I7 C( c7 ]& z( b" Y4 n7 \
- }
( E" z& G, c& k& J% o - : L1 ~% Q3 }& V# v8 Z
- public void setPassword(String password) {$ W. p, I1 a. i4 |
- this.password = password;8 N* c: S+ f1 I% @6 `9 v. B, E
- }2 K5 }5 W. U* b
- }( H9 Z8 b5 R0 Q" R
复制代码
0 W) w: c: o7 C9 m4 W) ~
2 y! e ]2 r7 l U& j3 B( S6 v- G7 ^8 blogin.jsp2 v6 r5 Z8 M$ J* g; D& s1 O8 w
- <script>2 [+ `7 Z6 J6 s5 B* P3 f
- var path = '<%=basePath %>';
3 b+ n3 k: i5 j. V( s) U3 e - function login(){
1 n; y6 ]7 ?# k4 Q( t+ p% O( } - var username = $("#username").val();% S2 T9 N) {! t/ O8 H4 i
- var password = $("#password").val();
+ H8 m5 K7 C4 D/ h( j( N! N, C - var data = {username:username,password:password};# R; K$ @" V3 K, R" t, ]+ P0 \! u
- $.ajax({; _# Q7 \' `$ z# C" D/ f8 W2 l
- type:"post",' ^' B1 ?: ~5 s! H9 [5 k# Q
- url:path+"userAction_login.action",
, L; [' ^1 ~5 }* \! P" n+ ] - data:data,( ]; U! d5 R& {
- dataType:"json",
( g+ I; R) G! N9 Q - async : false,) Q. N) ~2 o& J. c2 d: r* [7 }7 {6 G
- success : function(data) {
* W4 L) f0 S% S) u+ R" ]/ e2 H0 p4 m - if(data==="0"){" X- f! u, ~- p% l
- alert("登录成功");
, m8 d$ [2 M+ q" o F/ ?" | - window.location.href ="http://blog.52itstyle.com";
. [1 t$ W* M- Y9 g# \- e: W5 l - }else{7 N! c3 \6 p# T6 C
- alert("登录失败");! d8 |2 _7 {* {3 W+ {5 L8 q, Z
- }" {% G3 b5 Z( A6 j9 ]# a. F
- }/ N# e0 S6 T& u* K, d+ U
- });* V" d5 h/ ^4 ^+ Z8 I
-
$ J" a \: W* v/ U - }! B: l& v/ V' B
- - v4 U. w7 N! \# Y
- </script>
复制代码 . [. E3 Y6 f1 Z8 ]6 k
页面展示:
/ X" Z# L& |0 w
, K) i: y' s: ^) p4 n
5 `; U! z' M9 V
, s: l9 L3 d4 ^+ V8 ^+ @/ B. Y
基于Sturts2实现一个简单的登录功能.txt
(64 Bytes, 下载次数: 2, 售价: 1 IT币)
3 Q# m$ g( ]8 p5 m5 X$ `+ G" Y y
|
|