TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
Sturts2漏洞百出,可谓是年年都会爆发一次或大或小的风波,但是即使这样,Sturts2还是有一批用户的。
& x: |$ T" |1 |5 \" Z# e3 p% B花费十几分钟,简单的搭建实现了一下基本的登录功能。都是入门级的,高手肯定是不屑了,但是对于初次涉猎的小白们,还是可以提供点参考的。
- r" c& w! C9 O3 q' ?+ [+ z Y6 n. ?! U0 o1 o5 O8 I) j
注意:' [( |* ?8 V* c; ^3 }# `
0)项目Demo可以正常运行并经过测试+ \8 f* }' G/ ^. f: ~0 B: e
1)代码是伪代码,自行添加逻辑% I7 L" D% u% h) Y
2)struts2-2.5.10 加入了Action验证,注意 struts.xml 中的 <global-allowed-methods>regex:.*</global-allowed-methods>
/ _- @! j8 _6 ~: u! U L' Z( f3)struts2-2.5.10 拦截器修改了路径,注意web.xml中的配置 q; K3 E/ `. ^3 z' j+ [; S
4)本案例,返回采用json数据的形式,使用struts2-json-plugin-2.3.20.jar,json配置见struts.xml 全局配置。; X j9 s- Z$ ]5 g8 T, ]
. \ p( d+ X) K& R7 N一、项目搭建(使用最新版本struts2-core-2.5.10)& f4 w- c' H: V9 H7 @7 Z
6 y) A- w3 ~; b- w: l5 m0 I
1、相关JAR1 V% }7 N& y6 D# {2 o& v
commons-fileupload-1.3.2.jar: ?! n. l- y8 ~" p
commons-io-2.4.jar
8 f/ t: z6 z% t7 |2 i* \4 f3 Gcommons-lang3-3.4.jar E2 z+ G- l6 `5 a; R# I) Z
commons-logging-1.2.jar; S$ ]" T! j6 w- ?% h. Z- Q' b
freemarker-2.3.23.jar
% A x" d" Z! B ~javassist-3.20.0-GA.jar
$ x) A1 e+ r3 V" D5 @. `2 k# f0 klog4j-api-2.7.jar8 Y' j& d4 Z4 _- R/ X& m4 x
log4j-core-2.7.jar; A* ~! `2 g. E! X
ognl-3.1.12.jar
; Y, E* Y K+ f1 `7 d" gstruts2-core-2.5.10.jar
8 K5 V& h* G. Lstruts2-json-plugin-2.3.20.jar
! d. t! j) _# W* {' n9 Nxwork-core-2.3.31.jar/ O; E' P) Y+ H) q1 }
8 U. C1 z; j, `+ H, I7 M, u2、前端框架
) `5 h8 S A/ q3 w1 h5 f/ m0 YJqueryjquery-1.10.2.min.js9 \0 m7 i" \0 X* n% K P0 R
bootstrap.min.js
& {' X0 e6 w3 [$ g- B
- v: z5 I+ g. J! O, E3、相关配置:4 S& x6 R6 B! r" {1 ~ a
web.xml9 [* t+ y# I4 ^9 t0 X
- <?xml version="1.0" encoding="UTF-8"?>
3 f$ y7 A$ ?- c - <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" >
/ _ s2 I+ E! @- {7 z - <display-name>struts2</display-name>/ d% f2 E% T' F1 `* v& Q
- <!-- struts2配置 -->
" X. B5 Y8 E6 t1 c/ Y9 J5 h7 o& l - <filter>
* W4 Z" v2 r, D# v - <filter-name>struts2</filter-name>; W: X5 w3 l) h M) E
- <filter-class>+ S' w. R3 J. r
- org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter1 v5 [. e5 c4 \% Y7 s' b) c4 V! o* n2 }
- </filter-class>6 i7 ` g$ ^+ z3 a9 F! n) Y
- </filter>
4 J5 F( D9 X& W1 J# G2 A5 g8 {! g - <filter-mapping>
) ]* [# Y2 W; z - <filter-name>struts2</filter-name>
j$ m! Q3 ~* s- z, R0 p0 J. a - <url-pattern>/*</url-pattern>( U8 g2 P% K! a* n( N- \
- </filter-mapping>
% i5 y/ Y6 k$ s - <welcome-file-list>! q, K5 v2 T. V, ?' {; J$ ?
- <welcome-file>login.jsp</welcome-file>
7 \# f7 v3 \3 ~; ?$ o0 ` - </welcome-file-list>
4 O- }. a. {( A" O9 K" } - </web-a
复制代码
8 L, t" n5 e3 b [, }struts.xml* |" @7 {( X; _/ _/ D
- <?xml version="1.0" encoding="UTF-8" ?>+ }+ L* E8 V4 d8 S2 q! s6 V/ I
- <!DOCTYPE struts PUBLIC
8 J, J: y( ?! m' R0 M( g - "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"* `# x2 {/ } i' D: d/ U$ H- ^
- "http://struts.apache.org/dtds/struts-2.5.dtd">
( {$ B9 g+ v" t& a6 r0 T& _ - <struts>& e/ b+ Z- }( z
- <!-- struts配置文件改动后,是否重新加载 -->
' u2 e" _* A' Q$ r - <constant name="struts.configuration.xml.reload" value="true" />
, ~2 l# t8 v6 F# ?- r' k: ?% \ - <!-- 开发模式 开启它则默认开启了i18n.reload、configuration.xml.reload 上线后要关闭此选项 -->% ^ a6 T9 e) f4 t" h j/ ^
- <constant name="struts.devMode" value="false" />
. T; C8 Y8 P3 m& _% }2 J - <constant name="struts.i18n.encoding" value="UTF-8"/>
( T% S* i2 z* e9 e, V$ y - <constant name="struts.multipart.maxSize" value="1073741824"/><!-- 上传文件最大值 -->) Z/ i$ I/ x# t# g
- <constant name="struts.custom.i18n.resources" value="config" />: ~8 `7 I! R( ]. L
- <constant name="struts.action.extension" value="action"/>
- H. g8 o' }8 B - <package name="struts-global" extends="json-default">
3 h# T# q: B$ v - <!-- 配置Json输出 配合使用 struts2-json-plugin-2.3.20.jar 后台配置 message -->+ U+ w+ ?' q' o8 p9 r, A
- <global-results> " T, H s L1 X1 J) \
- <result type="json">. }5 g: o- Z* D* [) b. K8 G
- <param name="root">message</param>& O+ E: Z, \) l6 t. n
- </result>2 s. {6 \+ n7 ` K K/ x, o5 r
- </global-results># J( A0 f! z# m) D I% p
- <!-- 2.5.10版本 匹配 -->
" T8 |! C/ I4 i+ K, P - <global-allowed-methods>regex:.*</global-allowed-methods>- |6 E" V2 ~2 h+ n. D
- </package>+ a% t i4 N/ j% |& r- ?- R
- <package name="user" extends="struts-global">
: z1 Y! R" ` m* N0 @' m) e- r. n - <action name="userAction_*" class="com.itstyle.web.user.UserAction" method="{1}">
- R1 K- Q, B9 _" } - <result name="logout">/login.jsp</result>7 w* Z; C' l! f
- </action># s) K; k+ F$ A$ V, p# {1 g! C
- </package>1 ^& k( Z) J7 `' a
- </struts>
% S- \$ P- V3 n) b) u: W+ B - 7 i+ ]( N1 @8 E% T+ S5 s e, j
复制代码
2 ~2 [2 `0 [: U5 c, |. ?# X5 j) v5 A
UserAction
3 t0 j1 [: B9 f! m9 f5 o- package com.itstyle.web.user;+ X) |- y: W8 @2 r3 s, P# _0 q
2 _9 h9 ~2 J9 R, v9 `7 D- g+ D+ K- import com.opensymphony.xwork2.ActionSupport;# G! |1 @# Z, B. O
- /**% J1 m$ K3 Q) ~* G
- *
, m5 H. Z! W+ W0 M2 x3 G: t - * @author 科帮网) ^8 _) l+ W5 A; T
- *
8 J x. C" Q0 z: V3 k) p+ l - */' s7 N, t* L5 n
- public class UserAction extends ActionSupport {! D9 U1 G" B7 L& x5 W% X6 ?4 H- o7 P
- private static final long serialVersionUID = 1L;
8 X( [2 n1 b* e# d1 ^ - private String message;8 n+ C$ L% w" D. p
- private String userName;
) u( Q1 f! e6 L8 i) ^$ x - private String password;- u7 {6 f1 j9 e+ R" O8 U
- 5 U. W5 T) \" u; d* h8 o: a
- public String login(){4 d9 y" e, p& ]0 O- r
- if("admin".equals(userName)&&"admin".equals(password)){/ Z, P: X+ }$ T4 X7 z2 G5 @, b
- message = "0";. N7 i- p Z$ h2 @! R: z9 k' ~
- }else{: e" ~+ |& D3 ~* h! K/ ^
- message = "1";( k2 x! Z& @9 R8 O% F! p& c% {
- }( m. ]& s0 D0 j+ [2 {5 Q- r2 }
- return SUCCESS;
W4 z& I$ o B8 J - }! `: `: S# |2 a8 @
-
% ~: w5 x" J; d - public void setMessage(String message) {
/ j" Y1 l0 \" w G3 D/ u* B8 V+ M - this.message = message;' b: E/ x* N8 j) D5 @( R# k
- }
9 q* C$ h# |) x- K, W - public String getMessage() {; ?3 M6 B$ M0 I# K1 u7 S
- return message;. t6 F$ a, p8 ?5 l0 A1 c4 @
- }% b0 m( @1 h: v" l
( M3 x& t; W% k- S' e- U# M( Z- public void setUserName(String userName) {* p) M" ~# u- y7 y5 W+ c
- this.userName = userName;
( O5 g3 C2 i# T - }$ n1 a; ?" C" U3 a
" s# P) h. b) a5 }- public void setPassword(String password) {0 s& ~" i$ E' G1 f6 D7 W! I
- this.password = password;
& @, A) @3 {( L3 n2 t - }" S) `# L: v3 i3 I+ b6 m" C! h$ v
- }
, ?1 y# c; Q# Y
复制代码
( k' z5 o4 |& H& E5 _& q& j( y7 R
' t& @- X" p- @* @: Qlogin.jsp- I" E8 s5 {+ w2 Z8 c
- <script>
8 A% E5 s/ j8 p* A - var path = '<%=basePath %>';
9 a. J: Q! k% e, m, E# ] - function login(){
5 ]# E' Y; o$ |, S1 ~) w+ s. G - var username = $("#username").val();, k% Z! s( g, q/ Y
- var password = $("#password").val();' \% P& K" r4 ]" \2 {5 o1 b
- var data = {username:username,password:password};
: s4 l. ~; F3 y+ {! Q# ?1 ] - $.ajax({
& _' A3 L* Q* @! o' i0 m5 G; L, d - type:"post",
" K5 Q+ _. M' b9 }/ c g2 U - url:path+"userAction_login.action",9 a: k/ X3 W Q, S7 L; r: c
- data:data,8 C2 k$ L V y7 r* a2 t5 U2 X
- dataType:"json",) R0 D+ M* ?8 b1 l$ J/ _) A( V! Q, a
- async : false,
# X# `0 ]3 s% L( j2 t3 x7 u, s7 Y5 \ - success : function(data) {
8 F0 z; ]# G3 c' ^8 F" K - if(data==="0"){
1 F- t4 K6 c5 Z# X9 k d9 V# K - alert("登录成功");
4 o9 N6 A# c# f/ y e( h5 C - window.location.href ="http://blog.52itstyle.com";: B: x3 a+ V8 b& t9 A
- }else{
6 u: _, b- c1 s2 E. K# u - alert("登录失败");. Q# U( S' Y( k' F. i: f8 b
- }
6 G d; v0 ]% \* N8 b - }
" ?1 ^7 ^+ z1 R. j" r - });
8 X# _9 k# h9 h4 z+ V -
8 k( b- F. Y7 `: F! {/ W6 Q$ Z - }
9 U# M+ l0 D/ F7 m; m' e
D/ k& u3 }; o3 R3 m7 t- </script>
复制代码
! `; ]: u3 X' ~" _3 y4 R页面展示:- m- F2 P& @8 Y% M* l3 N; L
8 B: E/ t: Q6 G' Z" G1 _' x
: o+ V, E/ c+ V2 q s
o6 t+ X& Y* P$ L% t
基于Sturts2实现一个简单的登录功能.txt
(64 Bytes, 下载次数: 2, 售价: 1 IT币)
8 g- u/ N8 H% q& X2 e |
|