TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
Sturts2漏洞百出,可谓是年年都会爆发一次或大或小的风波,但是即使这样,Sturts2还是有一批用户的。. Y! O6 p$ v o! Q: i4 d
花费十几分钟,简单的搭建实现了一下基本的登录功能。都是入门级的,高手肯定是不屑了,但是对于初次涉猎的小白们,还是可以提供点参考的。
) I$ [) p8 L( o. S: i) W9 B4 s! B! v; [* l6 I" z ~, k+ W. v' k0 `
注意:6 ]6 ^2 D( ~ C: p# J$ d) c
0)项目Demo可以正常运行并经过测试; {- M* G# W- o5 L8 ]) [: Z3 q; C
1)代码是伪代码,自行添加逻辑0 S5 d8 A x4 Y
2)struts2-2.5.10 加入了Action验证,注意 struts.xml 中的 <global-allowed-methods>regex:.*</global-allowed-methods>; Z! ~6 \$ b6 Y4 l0 e
3)struts2-2.5.10 拦截器修改了路径,注意web.xml中的配置5 A8 e' K3 i3 H5 D3 j
4)本案例,返回采用json数据的形式,使用struts2-json-plugin-2.3.20.jar,json配置见struts.xml 全局配置。
! O- S. r$ o! P- X8 u5 ] w7 F' _
: ]) R B8 r2 C$ _6 a+ Y/ k T& c一、项目搭建(使用最新版本struts2-core-2.5.10)5 Z9 E& @; S/ J# y0 X
$ [' h. o t$ ~3 v# W
1、相关JAR7 G7 v6 k( w1 a$ e0 Q
commons-fileupload-1.3.2.jar2 t# f4 ^4 `% n0 E3 ~
commons-io-2.4.jar
& y9 T+ w5 G/ b; Gcommons-lang3-3.4.jar
- v& E$ a8 s; J r) d% C7 R) X2 ycommons-logging-1.2.jar
; S" u6 h9 p# mfreemarker-2.3.23.jar
7 B! _) Z9 W- C( [/ U( ejavassist-3.20.0-GA.jar; {2 L' Z& K y* O" F
log4j-api-2.7.jar
+ `" A P, b$ s' ^1 }! Y& Wlog4j-core-2.7.jar
# l& L7 W5 h# g! u0 m, L: D. U8 Kognl-3.1.12.jar
6 W: M: `* }1 Q% K: M4 Rstruts2-core-2.5.10.jar' {* G$ ^! w! o# q) t" B* m
struts2-json-plugin-2.3.20.jar
4 Q& g, X/ A6 R& b0 f5 e# l9 @4 u4 `4 Cxwork-core-2.3.31.jar( p6 v. |# Z) A; g7 y
, C4 A: `! _/ g) z7 |
2、前端框架
1 [+ `* B, V P& _# S; I+ hJqueryjquery-1.10.2.min.js
5 ?/ A+ b* |1 ibootstrap.min.js
) {; q8 \. K. D4 s& O; z& f# j4 B" j$ d" |
3、相关配置:
2 \( T5 ~& I6 t/ Hweb.xml2 ~1 s, @. ^, x. H) Q/ R
- <?xml version="1.0" encoding="UTF-8"?>* x. q8 y9 X9 U/ T1 A
- <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" >8 v2 t) n$ r' Q$ P6 i: C
- <display-name>struts2</display-name>
1 R# w Y: h/ _& ~+ s% R1 s0 M - <!-- struts2配置 -->; k% W. g* J9 M. a0 t& h$ k2 m
- <filter>$ E! Y, A) A6 m
- <filter-name>struts2</filter-name>
8 |% L0 u7 {( i: D! I' G - <filter-class>& u4 s( d. q A) A$ ?; D$ k
- org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter0 c. R3 h, `5 H, V% h
- </filter-class>
$ i; ?% y# b5 |* J - </filter>
- z; M5 U8 k2 h - <filter-mapping>0 `( S9 u R d+ U; w9 V5 S
- <filter-name>struts2</filter-name>5 K8 i5 t$ ]% ]* H
- <url-pattern>/*</url-pattern>
+ C7 K+ i9 ?0 L6 V& l% ?' S! G - </filter-mapping>
' V+ h R% m/ b - <welcome-file-list>$ n; r$ d4 p; W/ I
- <welcome-file>login.jsp</welcome-file>
" O+ t1 N/ t* I( W$ |" @! N6 _ - </welcome-file-list>
. u; z/ b2 w" ? - </web-a
复制代码
- C9 v3 _3 N! |% k9 Z, g/ C, r3 _struts.xml4 ]* P) `* q5 L" H2 }! c
- <?xml version="1.0" encoding="UTF-8" ?>* h% L8 f0 ~+ C& j/ D5 y9 { }( t4 J
- <!DOCTYPE struts PUBLIC
, Q0 e+ l3 v$ R: ]9 F9 E6 ]8 D" y - "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
/ a- u8 e; l2 t - "http://struts.apache.org/dtds/struts-2.5.dtd">
3 X$ _7 b* Z [7 }" J* q - <struts>& R. S- x9 z5 [9 G, G
- <!-- struts配置文件改动后,是否重新加载 --># z) [/ t; }; x7 i
- <constant name="struts.configuration.xml.reload" value="true" />
( Q- ^* q# y# |) J - <!-- 开发模式 开启它则默认开启了i18n.reload、configuration.xml.reload 上线后要关闭此选项 -->; T6 D* E* w5 d8 A
- <constant name="struts.devMode" value="false" />
6 P9 i- o9 {! F. D& H) H - <constant name="struts.i18n.encoding" value="UTF-8"/>
# ]$ t- m8 `* E: x" k( a, \8 T. k - <constant name="struts.multipart.maxSize" value="1073741824"/><!-- 上传文件最大值 -->: b8 i4 g4 E/ o: G0 B% u1 @
- <constant name="struts.custom.i18n.resources" value="config" />
5 ^7 T- P- u7 E6 M3 A6 B/ V - <constant name="struts.action.extension" value="action"/>
: V7 z7 g% |) x7 X. D. Z - <package name="struts-global" extends="json-default">
; E3 N0 T3 \& e- P* F( r2 n$ E" K+ n - <!-- 配置Json输出 配合使用 struts2-json-plugin-2.3.20.jar 后台配置 message -->5 V/ Y' o. m. v& z- M
- <global-results>
9 R( U) L( R. n. O2 [ - <result type="json">
8 t1 V, E. t' D1 h W - <param name="root">message</param>
u+ C9 g3 g9 n. I: E - </result>
) U" X- B- ]4 d, F! g* v - </global-results>
: ^0 y k2 h3 Y) J# A- z - <!-- 2.5.10版本 匹配 -->
) N" b$ k+ p1 i+ Y - <global-allowed-methods>regex:.*</global-allowed-methods>% F5 e2 X) M: j; h: a' h! b9 _
- </package># q) l- q9 l; A: r
- <package name="user" extends="struts-global">
) H% u/ W+ ^! x+ K - <action name="userAction_*" class="com.itstyle.web.user.UserAction" method="{1}">
: j7 r' _9 o. [7 r7 `9 \ - <result name="logout">/login.jsp</result>
* ^) p, T; ~' y* r - </action>
& i3 I4 R& z8 c! t K - </package>2 C: T' i$ U2 Z- k) g8 c. e
- </struts>6 ]; y' P$ Y+ \+ H7 M5 X* p
- 4 D$ j: y5 F: t
复制代码 ) d# ~4 v" r; p* e( [
" C0 i5 O7 k1 Q1 C
UserAction
0 i: L1 Q# ^8 ^- m6 B H- package com.itstyle.web.user;+ P2 U2 Y0 u" a e9 b% d
- & F# E* J2 k& g6 N
- import com.opensymphony.xwork2.ActionSupport;1 h( M V% N$ ^) c& C& h8 \
- /**: V9 n7 n0 G/ P
- *
7 x9 g6 e6 @0 k# m+ t - * @author 科帮网
: u5 W$ I9 [; \3 O! T* w - *
: x! `5 @ A* h( m# T - */
3 Q0 D* u% I6 [% Q" } - public class UserAction extends ActionSupport {
( t1 ]' Q/ ]. v+ ^: x - private static final long serialVersionUID = 1L;
6 l' y( b1 m1 q* M; H7 i0 }4 ^4 y - private String message;% i! i+ c; u# Z5 C0 {! N
- private String userName;
V8 {; l( n" F( X! M5 Z4 j- U0 ` - private String password;
8 L& {8 {; W! g2 U - 8 F! O* L; i, g1 Q8 Q3 u& U
- public String login(){
5 i$ H" X6 d/ x" L) ~ - if("admin".equals(userName)&&"admin".equals(password)){
* H6 c+ j" @8 N7 p( N - message = "0";
0 E) R2 `, Q# ~4 U+ S - }else{
3 h/ e. I5 j6 x' {5 t5 a - message = "1";2 S- O% x# Z* a
- }
4 ]) O+ Z( T0 F: q8 ~5 \ - return SUCCESS;
9 t. a. y! ?; a9 `3 r( Y! W - }
% D/ u3 L5 C; k# r$ O& z" m - 7 R6 \2 t& H3 ]. [) W; l& Q
- public void setMessage(String message) {8 r, N* k& T# M& y
- this.message = message;: T( Q+ l, ?7 a+ {9 v: Y
- }8 K8 h& n* e6 f4 C) w; B! `
- public String getMessage() {
' C2 ?6 X3 D7 o0 }: u - return message;1 z% S L% w, \' A7 j
- }
+ K6 k5 | H) m3 p- f
+ q9 l* _8 A8 { |( J9 c1 ]- public void setUserName(String userName) {# n% k% T+ f6 r, j4 ^0 K
- this.userName = userName;
- M9 y1 t& U) R2 r - }
p' m0 v' Q/ P( F0 M* z& f - 7 k7 f$ V0 X! [
- public void setPassword(String password) {- |, P. {7 l2 c( @, V0 ^4 z9 U
- this.password = password;
9 l% w6 f9 C/ E- t% P* x - } S, o6 h! e9 l, f; V" G1 Q# Y+ p
- }% Q4 C D- W- R/ F0 V$ L% e! F6 \
复制代码 ( ]+ {8 b; c1 b, T4 Y. J
: t' S) f, Q E) {2 N) xlogin.jsp+ t X" A! T, K& V* s
- <script>
. e9 \* `8 x u/ T - var path = '<%=basePath %>';
; e3 k" @- z: {. y: w6 I% R( } - function login(){0 e% E1 l% R( O" {) v
- var username = $("#username").val();
5 K% B4 g* J4 k9 I' m( I# N" | - var password = $("#password").val();
7 I# L8 R8 B2 g3 ]5 e& ] - var data = {username:username,password:password};
3 t T% }. R: x5 V9 X - $.ajax({4 ]1 k. V4 }$ s/ {7 s, R5 m
- type:"post",
8 X; A4 {: G# M- A9 @0 P0 y - url:path+"userAction_login.action",3 g1 e1 D6 _8 P- v- |+ _
- data:data,9 `/ q6 G9 \5 c3 }! p5 k
- dataType:"json",
6 \& ]1 n: k9 _ - async : false,2 K! b; q& M- G: l# `2 |: v( j
- success : function(data) {2 M q5 W. Z7 m7 o0 Y$ C
- if(data==="0"){! `+ g- J3 O7 ^# C; a
- alert("登录成功");
2 ~8 j' L" H! o - window.location.href ="http://blog.52itstyle.com";1 _% E: h7 ` R1 s9 |& a
- }else{
0 U- @$ A, L C - alert("登录失败");1 p$ F& U. w- R t
- }
: U4 }* A+ }" }9 |2 w' O. W2 t - }! u- K; Y7 N5 q: c" B
- });
! O4 q6 h' N- h( ?6 m - ( q' U' ^* ^% ^. \
- }
- [# o9 u- ~' w, h
7 b4 ?1 W+ K4 [& H, k4 v- </script>
复制代码
! U. r/ f- A6 r+ b W: n; y+ q页面展示:
3 g! Q8 _5 c) i$ q* Q6 K' q) M5 ~3 O5 O. M+ L' k5 a
4 [6 }+ d* p+ B) J0 B& f
/ |/ R: L5 @! |9 x' c+ H# T! H! c
基于Sturts2实现一个简单的登录功能.txt
(64 Bytes, 下载次数: 2, 售价: 1 IT币)
4 A8 s/ B3 V% J+ \
|
|