TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
Sturts2漏洞百出,可谓是年年都会爆发一次或大或小的风波,但是即使这样,Sturts2还是有一批用户的。/ h! z: D- m* y @% A$ T ]
花费十几分钟,简单的搭建实现了一下基本的登录功能。都是入门级的,高手肯定是不屑了,但是对于初次涉猎的小白们,还是可以提供点参考的。. B0 R; X! }3 l
6 L! _ }& k7 T$ P* n% ]. ]注意:
5 w( X( ?' L8 m% M5 k( R' ~0)项目Demo可以正常运行并经过测试8 [. R- G4 O$ F
1)代码是伪代码,自行添加逻辑8 [& \- h' [$ ^# S2 ?6 p& g
2)struts2-2.5.10 加入了Action验证,注意 struts.xml 中的 <global-allowed-methods>regex:.*</global-allowed-methods>8 N! w/ s2 h5 F& q
3)struts2-2.5.10 拦截器修改了路径,注意web.xml中的配置: ]* m9 v% Z2 i& W, d# _* C
4)本案例,返回采用json数据的形式,使用struts2-json-plugin-2.3.20.jar,json配置见struts.xml 全局配置。; b' u( f) P+ ~1 f
8 B" O+ Q w4 ^一、项目搭建(使用最新版本struts2-core-2.5.10)
* Q5 j. E. H1 l2 P
& z3 `2 B3 }. N& X1、相关JAR
5 w* @0 l; \0 H% E7 f! ecommons-fileupload-1.3.2.jar9 o3 v, y: V" A* Q3 q" w
commons-io-2.4.jar# B9 Z5 t% j- A! Q: B" k8 G U
commons-lang3-3.4.jar
- u& m. u" \0 n' C" Gcommons-logging-1.2.jar7 y/ A" V: _: V! j0 n! d5 a3 _2 L
freemarker-2.3.23.jar8 w1 n; Y3 M7 @. W. u
javassist-3.20.0-GA.jar) h8 v4 z8 p; g7 x
log4j-api-2.7.jar7 s* D/ z# A, D6 s6 J+ ^* n* _
log4j-core-2.7.jar5 I# y. U/ ~4 W/ E& g: z% H9 N/ |
ognl-3.1.12.jar& z- c, v$ M2 P! |; a! z
struts2-core-2.5.10.jar
1 U# ?+ ^+ m* ^struts2-json-plugin-2.3.20.jar
8 [1 U0 d5 H; U' k1 H& I/ g- axwork-core-2.3.31.jar
7 V8 P9 \* \7 i& [9 J- D0 o/ [' i& C, F, U( f/ S( M2 M0 ^+ \) m
2、前端框架
6 A' t# X/ R6 _& E0 \9 aJqueryjquery-1.10.2.min.js4 R) M/ ~. {7 Z; u- d0 D. m+ o
bootstrap.min.js
& a. C$ D; O! R7 N- ]1 b! w& x% [
9 Y9 f p1 o: h/ ^. y5 T* [; o3、相关配置:- {4 c1 [1 Z: e
web.xml
* g+ c9 Q( v* E4 g% ~/ B8 |- <?xml version="1.0" encoding="UTF-8"?>
' W% ]- D7 W1 p1 `+ k' X( V8 s" K - <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 h6 _9 M: h0 `$ k" A; j
- <display-name>struts2</display-name>
" g7 V3 p3 @. i; b: ` - <!-- struts2配置 -->
- c4 E" W# ~" A0 c$ N9 ~: Y - <filter>* N. H/ k2 A( L6 X5 l" R" f
- <filter-name>struts2</filter-name>
) b2 Y9 X) ]. E+ S( `$ u# H - <filter-class> o; A5 y5 B; f( s) v" w
- org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter
2 R# B- w/ h1 }7 ^# F - </filter-class>
+ ]2 ^' J r$ f9 u - </filter>
8 r6 V, k5 @2 C! w- O/ W8 |2 U - <filter-mapping>
) K& `& x2 s" p - <filter-name>struts2</filter-name>
: }% E& O' A% N - <url-pattern>/*</url-pattern>
' K; x+ x- {8 L. t7 j" B - </filter-mapping>4 n4 d+ a( i3 I0 a0 G; F
- <welcome-file-list>
, |- H" J( Q5 o% [3 E5 p - <welcome-file>login.jsp</welcome-file>, V. g, u% H% T) Q* A6 q8 {5 ]# z
- </welcome-file-list>; j; s" h# U, u7 t1 [4 I5 ]
- </web-a
复制代码
0 w, |3 K% o* r* X" V9 Q- R9 b8 wstruts.xml
! [# k7 _" Z/ M1 `7 @- <?xml version="1.0" encoding="UTF-8" ?>
$ o' f6 Z) d5 l8 U$ ? - <!DOCTYPE struts PUBLIC
/ K' S) @! ~; d0 V - "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
: E* O7 V& w" [# L& c - "http://struts.apache.org/dtds/struts-2.5.dtd">/ x3 b$ j) H/ o, W1 @
- <struts>
9 f! c; h/ e6 i5 E$ c5 e5 Z! G8 @ - <!-- struts配置文件改动后,是否重新加载 -->: Q! J6 z# d$ I
- <constant name="struts.configuration.xml.reload" value="true" />' Q4 }/ v: w/ d: q u; o1 X$ U
- <!-- 开发模式 开启它则默认开启了i18n.reload、configuration.xml.reload 上线后要关闭此选项 -->. Z" c. G' f1 _6 K
- <constant name="struts.devMode" value="false" />
. [# q0 L. B& E9 y, n5 T( ~) t4 q - <constant name="struts.i18n.encoding" value="UTF-8"/>" ]# `- \* g8 p$ ^$ z1 g; r
- <constant name="struts.multipart.maxSize" value="1073741824"/><!-- 上传文件最大值 -->0 w$ \1 @, @, w4 z" }
- <constant name="struts.custom.i18n.resources" value="config" />. ^5 T7 p& v2 O' f' d
- <constant name="struts.action.extension" value="action"/>
! I) X- T7 D0 ~% S( w( ` - <package name="struts-global" extends="json-default">
( t9 D: d- U9 K5 s/ u: O; o - <!-- 配置Json输出 配合使用 struts2-json-plugin-2.3.20.jar 后台配置 message -->
0 v3 }* `" \8 M6 @4 i! G - <global-results> : h. h9 ~0 i y0 i, @$ z
- <result type="json">3 Z' Y$ g f3 ~1 M. S# n; H
- <param name="root">message</param>
+ O& Q2 n4 a- v8 M+ J( P3 h5 x - </result>" B' m8 W* w6 C
- </global-results>
& ^ F2 ]! z$ [" ?+ k - <!-- 2.5.10版本 匹配 -->$ {% g" I3 k# p" _
- <global-allowed-methods>regex:.*</global-allowed-methods>* H* C( f' D% c8 S
- </package>* [, p4 r) u' a0 O9 u! _8 }
- <package name="user" extends="struts-global">
% N7 x+ R# h, o" [" ^& x' b - <action name="userAction_*" class="com.itstyle.web.user.UserAction" method="{1}"> A+ G2 w- ~9 y! @
- <result name="logout">/login.jsp</result>4 b' M' h7 P3 G: E% H
- </action>
8 }- [; j* J9 n; i - </package>, Z0 h( e6 v& h; p. X
- </struts>
, r9 [$ k% E `; w% E
5 O7 x2 d4 B0 Q( s% h- z; A4 l
复制代码 3 c0 H5 P# z$ L- Z4 E9 S- o! ~2 F
0 `) c+ v- d" Z, M" ?UserAction2 R4 c" ?; s9 r% A' w/ H& _' ]0 `
- package com.itstyle.web.user;
# }0 W8 ^' B. B* E" s# a* y% |1 G - K7 v' a/ E" c p6 u
- import com.opensymphony.xwork2.ActionSupport;
1 E, w3 r; }' Q5 K. v - /**
" V( ^: `, l2 c+ k! \) t - * 5 N' Y; z9 [ H& P
- * @author 科帮网
+ {! M. r# \4 k3 K- \7 K6 g! ] - *
& s. U- `) j- d& [! w - */
8 C8 g, `( v' H, X! I0 p: g8 x: T - public class UserAction extends ActionSupport {3 y% U: w# |* J' |
- private static final long serialVersionUID = 1L;
: N: s; T, \1 C - private String message;# j) o2 U" | `) j
- private String userName;% Z9 R9 t: W% C8 h3 w$ r5 f) V
- private String password;
R6 r1 H; q& N# }0 N3 B - ( J( V0 w2 _) j# N( a8 n9 s9 J/ X
- public String login(){
2 C [3 f1 y0 }' e: q8 N% [+ V - if("admin".equals(userName)&&"admin".equals(password)){2 l, T+ N8 L4 R2 w5 x0 C5 d
- message = "0";
* n7 M8 @9 d w8 b$ q" T6 } - }else{
: {- V9 R& o: \ - message = "1";
1 q B5 H4 {" t, Y1 z( V2 q8 I: }7 d/ G - }
7 I+ w3 b R# e- Y - return SUCCESS;3 G, N* `. y4 ?) W, Y$ o
- }
7 o* t! H0 x+ w& p k% ~ [ -
0 B, ~! l' I% ~) ]: t - public void setMessage(String message) {/ W w4 R3 J. Z9 ~6 L) F9 F# `
- this.message = message;
; ]( P$ `- m0 N+ V - }
0 y3 `) L9 H6 b6 _6 f1 { - public String getMessage() {, W3 u& _* A5 w
- return message;% b F- I1 h: g2 y' d/ m3 ], k) K1 u
- }6 b4 w* Y& f3 v9 k
) M1 i1 K7 i" h2 o- public void setUserName(String userName) {! N" T6 f* m8 g! V
- this.userName = userName;6 o. v3 n N: x( d6 r; g( o
- }
2 w9 g/ _: ~ v" V* x A/ u
& F+ z+ G& |' ~3 K, c. z- public void setPassword(String password) {
! z5 x: `- k" V, o$ f# T - this.password = password;: U# m' U. S' I0 I, B. m+ t( K
- }- z) F0 W5 n+ h) V" e4 Y3 o
- }
' P; q. F# N& v$ X/ f2 e Y: v) k
复制代码
0 E' y% q/ N# g& P; R/ v. @. t0 F3 O6 M' \: n( M8 B
login.jsp
1 E- {3 r7 w8 t V- <script>/ Z/ A0 |2 M% P
- var path = '<%=basePath %>';
% J4 ~3 d# F3 K+ o - function login(){
# {. N2 E Y0 R' y J5 Z0 c - var username = $("#username").val();
2 R5 G1 g" ~0 q" z - var password = $("#password").val();. L5 X8 M/ w6 x9 c% N0 b) P' ?0 |( R5 G
- var data = {username:username,password:password};0 R3 I- |$ ^* t6 l" ^. U- ~: B
- $.ajax({6 y# l. l' f" P# _# p2 |7 j6 X* l+ ^
- type:"post",
! _1 m) C7 w$ E/ E+ y - url:path+"userAction_login.action",
1 k, N! u0 C: A1 ?/ p8 W - data:data,
% Q+ }! T6 q* ?9 D - dataType:"json",& \+ v" R( ~! Z1 H+ D+ X; @
- async : false,
_3 l' ]+ H6 s/ e! ~ - success : function(data) {
( ~3 z/ \ @+ ?/ t - if(data==="0"){; H3 J% t+ w4 }2 u1 }: ~
- alert("登录成功");' p+ l8 s4 V" j
- window.location.href ="http://blog.52itstyle.com";& b7 v0 t/ i& L0 Y7 b7 `3 V( S: D0 f t2 z
- }else{. g5 l7 d8 b" `3 y- l; z1 u
- alert("登录失败");( R0 e! D( _ U& ?$ ~
- }1 o- ~- H" q! @( R# @
- }/ y" T. O. c+ Z: ^3 D' `
- });. k$ G+ V) p) E) y
- 4 y& d0 B( T6 o" }! S; j: ~, l
- } e' u( S+ t8 F2 W9 i2 c2 }2 \9 C5 K" T+ T
- ! L4 D: d' x/ P; t1 q1 S
- </script>
复制代码 - w/ N7 V9 K4 ~0 t
页面展示:9 ]" T6 o) `% r
) Y; ]8 z" } f" e* n
4 d. p8 w& B- s9 N' E/ ^& c8 j
4 o: y5 b% o+ [$ B+ @& C: b7 ]3 _
基于Sturts2实现一个简单的登录功能.txt
(64 Bytes, 下载次数: 2, 售价: 1 IT币)
7 @, c& x+ P9 M: D( S/ V, i% m: i! J |
|