TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
Sturts2漏洞百出,可谓是年年都会爆发一次或大或小的风波,但是即使这样,Sturts2还是有一批用户的。/ k4 T5 i; F$ r7 Q' o. c" i" {
花费十几分钟,简单的搭建实现了一下基本的登录功能。都是入门级的,高手肯定是不屑了,但是对于初次涉猎的小白们,还是可以提供点参考的。
$ l3 @5 V M$ t) u- {, N$ h" ?/ M: {, A( u
注意:. x; W8 O, {! g o/ T* F" {
0)项目Demo可以正常运行并经过测试) i; O! z+ }: Z9 `& Y
1)代码是伪代码,自行添加逻辑
, K) t0 P; e& A9 T& O: s2)struts2-2.5.10 加入了Action验证,注意 struts.xml 中的 <global-allowed-methods>regex:.*</global-allowed-methods>
0 G" m5 j2 V3 O* M3)struts2-2.5.10 拦截器修改了路径,注意web.xml中的配置. R; M9 W3 X" Y% }7 V
4)本案例,返回采用json数据的形式,使用struts2-json-plugin-2.3.20.jar,json配置见struts.xml 全局配置。
r# A r9 T3 }: _
1 W7 }2 ~1 I/ j& s! X$ H* o: R一、项目搭建(使用最新版本struts2-core-2.5.10)6 R: |; ?; R- s! `
1 J {! T$ N$ J7 o; d
1、相关JAR- F. \3 N& R T% F& U4 o
commons-fileupload-1.3.2.jar! q+ a! X" T7 S+ `* D
commons-io-2.4.jar8 a1 {! ~, {9 g
commons-lang3-3.4.jar
# r) X* B6 @2 n) z4 gcommons-logging-1.2.jar5 A# k: _4 K7 C3 w! y$ l
freemarker-2.3.23.jar5 |1 D4 j$ V' i1 k' V/ M
javassist-3.20.0-GA.jar
8 {5 V9 m$ g) r D8 W3 X' B0 u# ulog4j-api-2.7.jar
0 b7 Z9 j: U- E& Ylog4j-core-2.7.jar
5 N! D6 O; a, ~% h1 n8 s, Oognl-3.1.12.jar* J% ^2 I. x4 i% l9 P: q2 g
struts2-core-2.5.10.jar
8 _8 `- z1 a' L8 Hstruts2-json-plugin-2.3.20.jar: u [, m3 n; [4 `& H
xwork-core-2.3.31.jar
- L1 h, j3 j& u. T5 W8 g6 n0 D; V( m( f) o" `
2、前端框架& L0 k! ]/ n: {+ D) O' i6 K
Jqueryjquery-1.10.2.min.js: |1 K5 Z& \* t( {: i6 x
bootstrap.min.js' S2 U F7 _1 u$ F' p2 l, j
1 P* e' x7 z! V3 i1 r: U3、相关配置:# o! _6 M* t0 u
web.xml* a! p+ |6 Y4 B! {+ W( O8 ^
- <?xml version="1.0" encoding="UTF-8"?>
3 @: S6 w$ O6 C- b1 d, } - <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" >& I5 @8 {. U/ k% ~% n' l
- <display-name>struts2</display-name> }% Y6 u' a) u2 h" j
- <!-- struts2配置 -->
* D$ Z) M% W' J) W% M# \& d# b1 A - <filter>8 X f9 j$ w3 u! w
- <filter-name>struts2</filter-name>5 U# s8 C! ?7 Q+ [
- <filter-class>
, q/ e; Z- q. ` - org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter
2 k) V& I! }3 K7 b# P! u0 s: g' I" I - </filter-class># Y+ X- |2 i+ |: q8 T4 q
- </filter>8 {9 m; S5 v& k5 j7 n
- <filter-mapping>
( \: b$ W2 a4 w, }) X0 u, } - <filter-name>struts2</filter-name>( C* b0 r3 N6 j, H) x; Z
- <url-pattern>/*</url-pattern>' Y2 Z$ |# n; {/ t
- </filter-mapping># p* A, R. E. r" g/ T
- <welcome-file-list>
7 f! J) W* l9 N' x2 X: b+ n9 P - <welcome-file>login.jsp</welcome-file>
# ?3 W! n; j; ^ - </welcome-file-list>
6 R+ O3 f* p4 |" l+ A; ?0 | - </web-a
复制代码
3 I1 f# ^5 W0 r- ?" [3 _' s3 B; dstruts.xml
; L- K7 z1 s' p4 R, n- <?xml version="1.0" encoding="UTF-8" ?>
# a c9 P4 O- x. D' n! m( E+ o - <!DOCTYPE struts PUBLIC
2 u9 u+ t/ o6 x9 \- P( b( U' p6 v - "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN". M( k* Q4 a1 x
- "http://struts.apache.org/dtds/struts-2.5.dtd">
4 S, O* \( H# r - <struts>( L1 w( S, U G% V. E. n9 X9 D# h
- <!-- struts配置文件改动后,是否重新加载 -->
R1 m1 `0 t% v4 D' ~6 c+ y - <constant name="struts.configuration.xml.reload" value="true" />
$ G1 y) f2 a7 q3 p' L, V, l/ D - <!-- 开发模式 开启它则默认开启了i18n.reload、configuration.xml.reload 上线后要关闭此选项 -->
5 p% X' q3 Z# d7 z# { - <constant name="struts.devMode" value="false" /> G, n3 e* n% D3 R9 [8 N
- <constant name="struts.i18n.encoding" value="UTF-8"/>% v0 ^7 u8 `/ B3 n$ s6 Z2 M
- <constant name="struts.multipart.maxSize" value="1073741824"/><!-- 上传文件最大值 -->
3 l0 h9 B- U$ }" w8 b - <constant name="struts.custom.i18n.resources" value="config" />
, Y" D1 Y+ l( b; J - <constant name="struts.action.extension" value="action"/>/ y2 N; }( R/ Y! m
- <package name="struts-global" extends="json-default">9 N/ `# n3 ]" h
- <!-- 配置Json输出 配合使用 struts2-json-plugin-2.3.20.jar 后台配置 message -->5 G8 |( l: p. G* i" D
- <global-results> " }% U9 R5 ^4 J+ {
- <result type="json">: ^9 t& D% P) Z6 }/ M3 M6 p3 t
- <param name="root">message</param>
( i/ P, }5 s- l" [" D6 ?! v - </result>
9 ]3 W0 ~, M0 p5 G& F$ K' m - </global-results>* J. P {0 F# k) W
- <!-- 2.5.10版本 匹配 -->
8 F# @' B1 I8 v1 u9 R# G% E - <global-allowed-methods>regex:.*</global-allowed-methods>
9 D: t. t0 [1 ]8 s5 K1 L* X - </package>
. n% h% _; `4 x( W- c. t - <package name="user" extends="struts-global">/ [: D u# v" h V) ?* E+ _% s; `
- <action name="userAction_*" class="com.itstyle.web.user.UserAction" method="{1}">, o6 y$ g! h4 z) U$ e4 t
- <result name="logout">/login.jsp</result>8 d: B5 \* @! \! d- s( M( t1 ^2 @2 W
- </action>
0 ~: m$ A- ~; z& [( i* k1 z4 c - </package>/ Q; X/ O0 T# m/ B, g% U* \
- </struts>; S, J' _1 A% Y7 ~- @
- & K$ I% d: p5 {5 {/ I" A* v
复制代码
# k) Y8 F* P# W6 f, ~* Y) W! V
! c3 A! N5 Z& i/ @; V6 WUserAction
, Z( U8 L) o- x0 j9 N8 n- package com.itstyle.web.user;
0 N& T! o, c9 K2 U3 |$ q - 5 H+ Y! w0 h1 O, |* a: q8 k
- import com.opensymphony.xwork2.ActionSupport;
! \- v k- R/ Z* z9 m4 g6 v - /**# w- D5 k* Y1 f# A7 Y
- * 9 l& |" R0 w$ R4 g9 H' _
- * @author 科帮网
1 H9 B0 j" Y' T- E' Y; F8 ]! C - *7 f, d5 _; ~& l; K% G4 ^
- */' n% T" X2 M0 a
- public class UserAction extends ActionSupport {: Q, D; Z) n: n0 s) T
- private static final long serialVersionUID = 1L;
# [' b2 u& L1 \/ S: x/ t0 s - private String message;
. `- H$ `, P$ ^) M5 W% ^/ { - private String userName;4 S# k2 ~8 O+ K2 \" M$ }8 W* x9 R
- private String password;
5 U3 ~5 r* |% @% N! c; {$ t$ ] - $ a! l& ^9 K- \1 B$ }9 I9 X- f# L
- public String login(){$ o8 ?4 U1 J+ R+ Z" ~. `) @
- if("admin".equals(userName)&&"admin".equals(password)){# x# Q" p! I' i+ M% d" o
- message = "0";
& U5 ?$ Z& ~3 z6 {1 H/ Z - }else{
# m: u* w: k/ i+ ]. t( x" k9 G% e" v/ z - message = "1";
* h' J1 e1 G9 ?& H - }+ K9 o' V* {# R1 B. `
- return SUCCESS;
1 A4 w5 @- g/ |6 e: J: Z- u8 g5 b - }/ f# b2 L- J$ z# o
- # t+ T# G+ m1 x' x
- public void setMessage(String message) {- I j% H% F F
- this.message = message;" j/ A( a9 }. {( {8 i. m1 H
- }! n0 S0 U* Z1 Z- R
- public String getMessage() {
8 X6 ]7 x$ s$ O) Q/ v - return message;5 q7 W1 D1 r0 ^$ U& q
- }' p6 N) Y, @0 X% y3 H" H* W
- * F6 U& X% e5 P3 H0 Y4 Y
- public void setUserName(String userName) {
7 X/ B2 V- L t$ Q# k6 v - this.userName = userName;6 t; E: d/ B+ y8 F& b+ d S
- }" O) U5 S, J9 T4 f
% ]" _" o# K, }% g) i% t5 O- public void setPassword(String password) {% \% P3 a8 A, f" B. h( t; k
- this.password = password;
* ]& s" A3 w% C1 L: o h& g - }! S; q: { p: L0 x5 D
- }! \$ b& k& a% V8 p" M9 |* c/ D
复制代码
, [% d$ B( i1 q8 @4 E7 c, S9 G$ M; r) e0 K* f: d
login.jsp
6 S: ^' p: W3 x C- <script>
* z' `$ G: a! `2 A - var path = '<%=basePath %>';
9 g$ h+ y& } W. c, s. ^4 f - function login(){; }: F3 _4 `9 a \+ N
- var username = $("#username").val(); \1 V! h& | z, n
- var password = $("#password").val();! u+ v; |! h4 i7 x# n$ d
- var data = {username:username,password:password};
! f: J1 L5 @( x: d: w) y - $.ajax({/ {: k" V! D4 R, p: x' u7 n' ~1 E* e
- type:"post",
/ L* j( M: h% j: H% M j& m - url:path+"userAction_login.action"," n7 K8 U: t) c% k" u$ a/ f
- data:data,
$ P. U1 A1 u1 B, T - dataType:"json",
- h) U& e: ] v6 A- E - async : false,
6 @5 ]; H+ U3 h6 a1 l - success : function(data) {4 z, ?* R/ h1 l! B6 I& ]
- if(data==="0"){6 f7 g6 V6 |& v! V
- alert("登录成功");* q5 m; ?& n; a% A7 s4 C( z
- window.location.href ="http://blog.52itstyle.com";+ I" |) I9 s9 w h0 I
- }else{- ]2 }8 b1 F$ |+ d
- alert("登录失败");
k* ~# C9 Q5 A0 V - }
" a% P8 P6 d4 q7 K+ n# p2 B7 z# Y - }+ e8 T. }3 L5 e# v: X
- });
1 ]0 M' X! i0 }1 a1 A - " ]- y, P2 X- i% J! y
- }( `! ^ T0 m( m+ j9 E
, ]# d; _9 }3 o2 D. G- </script>
复制代码
# P) q: Q- {9 U- W2 f页面展示:7 I# s( ?+ T1 |/ N) ?3 m
/ Q& @- v- U8 o
. V# V$ |# y' Y& M$ T2 R
* A3 M0 X0 d* g4 H, t5 L
基于Sturts2实现一个简单的登录功能.txt
(64 Bytes, 下载次数: 2, 售价: 1 IT币)
2 Z* j' M* }8 h. b3 h* ^( k
|
|