TA的每日心情 | 衰 2021-2-2 11:21 |
|---|
签到天数: 36 天 [LV.5]常住居民I
|
Sturts2漏洞百出,可谓是年年都会爆发一次或大或小的风波,但是即使这样,Sturts2还是有一批用户的。
" o5 k/ u9 c8 ?3 _4 J花费十几分钟,简单的搭建实现了一下基本的登录功能。都是入门级的,高手肯定是不屑了,但是对于初次涉猎的小白们,还是可以提供点参考的。) ?2 j' j0 L- o+ ?, B4 h
2 I. q" V( B8 G' P0 X9 [注意:
- H1 m% i, }! w. m5 i0)项目Demo可以正常运行并经过测试
. r+ v" ?: ^. p1 n1 N7 D1)代码是伪代码,自行添加逻辑
. a& y) z9 Y9 K$ S$ r2 {2)struts2-2.5.10 加入了Action验证,注意 struts.xml 中的 <global-allowed-methods>regex:.*</global-allowed-methods>5 [$ S6 u& C8 ~, Y2 ~+ u% o4 s
3)struts2-2.5.10 拦截器修改了路径,注意web.xml中的配置+ ]* `4 I- y" ^2 ?
4)本案例,返回采用json数据的形式,使用struts2-json-plugin-2.3.20.jar,json配置见struts.xml 全局配置。$ b0 W1 p7 s! _/ p
& I5 Q) o( ~' ]5 a- a) i/ W) d
一、项目搭建(使用最新版本struts2-core-2.5.10)
, U# L q! }+ O, x, s7 R" T y2 s+ ^; s! j4 ?/ S$ P
1、相关JAR# F1 Y* e' Q) ]6 c$ o/ e/ ~: K) H
commons-fileupload-1.3.2.jar
2 q; ` F1 x. M: |6 [" Ycommons-io-2.4.jar
0 U. ~9 z$ _/ M1 Pcommons-lang3-3.4.jar
1 Z6 B# w! r7 k, x( A+ ^# g- ^commons-logging-1.2.jar
' \2 k4 {% b8 Pfreemarker-2.3.23.jar& d' U& C2 {1 O: W, d
javassist-3.20.0-GA.jar
* x$ X$ P& O/ I. R( J7 Ilog4j-api-2.7.jar
* m' b2 x( _5 f( Xlog4j-core-2.7.jar+ E& Z( J5 Q. o, T8 V
ognl-3.1.12.jar* P3 n, i/ x+ _; R+ {
struts2-core-2.5.10.jar3 f& r) f% k) n V1 J
struts2-json-plugin-2.3.20.jar% ^+ j( ^5 e* x8 v) T; Z9 M
xwork-core-2.3.31.jar
$ `$ r) G" v1 `# m7 M7 j/ `5 O$ r4 |. ^2 R5 L, J
2、前端框架
! @* @* W" y" Y' ?3 F' \Jqueryjquery-1.10.2.min.js
/ N& g5 R% W1 k: X& h: bbootstrap.min.js8 E* W6 ]8 \! a( |* A* M
" O, F& _* |% N' j5 B) I3、相关配置:
# I" d c) V6 o8 ?# mweb.xml2 g: \5 M' m( ]) q2 u
- <?xml version="1.0" encoding="UTF-8"?>
+ n8 B" q! G/ m8 ~ F, O7 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" >. N8 f% n- G L% {0 M7 L! t
- <display-name>struts2</display-name>2 o3 w. C F: ~
- <!-- struts2配置 -->: F% j( m- K/ R! P, h
- <filter>2 \0 X6 h, x5 x1 ~. c4 s
- <filter-name>struts2</filter-name>
% H ]" R, [/ N - <filter-class>6 k0 e8 d- D% o8 j# p( E9 j- F
- org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter4 g' h: I8 P- Y9 |9 y i( C+ W
- </filter-class>+ v8 j9 }0 t$ U- x2 E
- </filter>8 u. c3 F( o& S, Z
- <filter-mapping>
! s. }& L5 j8 D - <filter-name>struts2</filter-name>
' G- q7 Q! q& \- M& T9 G$ I& l - <url-pattern>/*</url-pattern>
8 e; |. S9 m# U! H1 Q - </filter-mapping>
3 R6 z# i) _: |5 O2 z0 `9 u - <welcome-file-list>
: E7 W G" J2 _ t: m* q+ G, U0 f - <welcome-file>login.jsp</welcome-file>
% h' y9 [4 o' e! U - </welcome-file-list>) R0 _ a5 A, Y
- </web-a
复制代码
. D& H9 X: ^9 |! M4 ~4 Tstruts.xml
- K7 @; _: E- o- <?xml version="1.0" encoding="UTF-8" ?>
4 d! H( d0 x$ _3 M4 B# Q - <!DOCTYPE struts PUBLIC
$ F" Z& I! J: w2 c/ ^ - "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
, m5 ^; r$ R) E2 o7 r% v - "http://struts.apache.org/dtds/struts-2.5.dtd">1 J, H& u' z- W/ r
- <struts>
K4 q' u( U- B2 O/ V* ?. O - <!-- struts配置文件改动后,是否重新加载 -->5 y& V( V0 q0 l9 Q9 _# v2 E
- <constant name="struts.configuration.xml.reload" value="true" />3 _+ A. R, a5 i: y3 m2 Y/ `( N& o# H
- <!-- 开发模式 开启它则默认开启了i18n.reload、configuration.xml.reload 上线后要关闭此选项 -->8 I7 N* p& G( E5 {: @- W, G
- <constant name="struts.devMode" value="false" />) \# }8 U/ z$ `/ h, e
- <constant name="struts.i18n.encoding" value="UTF-8"/>
* P& P, C( G( g$ U1 ?$ d7 ] - <constant name="struts.multipart.maxSize" value="1073741824"/><!-- 上传文件最大值 -->8 [! A4 O' R# m0 N% z
- <constant name="struts.custom.i18n.resources" value="config" />
5 }9 F5 u- Z" b: G' b7 y - <constant name="struts.action.extension" value="action"/>
0 t3 v# ^0 W" A- v - <package name="struts-global" extends="json-default">1 I& f0 `4 {6 N( X
- <!-- 配置Json输出 配合使用 struts2-json-plugin-2.3.20.jar 后台配置 message -->* c2 {# {5 D: M0 c2 ?; C
- <global-results>
) W$ t. t! |0 ? - <result type="json">
, D' G5 _, h! K# v+ J* b2 @6 [. ` - <param name="root">message</param>; F- i% O3 g: z: J7 G0 X# q
- </result>
, v! x: h) q' C1 b3 P - </global-results>
1 o- B' t3 N0 \. M3 B - <!-- 2.5.10版本 匹配 --># i/ u8 }$ \& Y! d4 b
- <global-allowed-methods>regex:.*</global-allowed-methods>
8 [( r6 ~4 r2 }3 N+ } - </package>
3 Q9 J4 O! g4 `0 b$ G! j+ [' w' i - <package name="user" extends="struts-global">
# G/ D4 }. o; ]. P. y. M - <action name="userAction_*" class="com.itstyle.web.user.UserAction" method="{1}">
+ R* h: t2 D7 k4 i- a# z - <result name="logout">/login.jsp</result>1 U( e; w# u( V2 ~6 f
- </action>" y+ U i+ ?& m4 V& _8 ~
- </package>
, q% ^: Z5 \) l' T - </struts>( F! C! ^6 D, C8 t* [+ m
- ; o9 H7 O2 v. J+ ]$ P* U: k
复制代码 ! H& q2 a7 j( a+ y# ^" ~# j. g
: E. y: V( y% L' ?2 MUserAction* v2 @& V& k$ v l6 K" P: O& Z8 b7 q
- package com.itstyle.web.user;' a0 W8 H' j7 C$ V5 r+ C
% ]6 G3 A/ q2 S4 `- import com.opensymphony.xwork2.ActionSupport;! g, j9 M. C: ?* i
- /**; k8 z. h& k* a/ ]- A7 \
- * 5 O+ d$ U1 k2 m8 ]6 v
- * @author 科帮网2 I6 y8 w( p/ _ ]/ b0 ~
- *3 r, Q) l- |3 o
- */
a+ x# V4 L$ {5 W3 i2 O! F - public class UserAction extends ActionSupport {( t/ u& y0 |) G2 u/ E8 N9 v, E
- private static final long serialVersionUID = 1L;
0 f# ~; M' O' L9 Q/ l% F* ` - private String message;
: \" j* s+ V2 | - private String userName;1 V3 f7 [+ X2 n. P" v* V( R+ ?! |
- private String password;
9 U0 b" z" r! V4 l - , M$ j4 K- |! c! P6 o
- public String login(){ W$ \" ^8 D/ |: M: a
- if("admin".equals(userName)&&"admin".equals(password)){9 `1 T o2 @( b' x& p
- message = "0";, l3 }; Q8 V6 L0 w
- }else{
[6 G- d/ V4 |" R) h3 R! b# z - message = "1";4 j) F) B5 S) s' a5 Y
- }
" X8 G) ^! u$ K4 ^ - return SUCCESS;; s* n" k8 c! J
- }2 m! \% g. b6 K9 i
- " F3 _1 q* `! G& `
- public void setMessage(String message) {+ b' E5 c. P8 ?5 r8 ^5 s' N. g
- this.message = message;* Z9 R, \0 ]4 {% g3 \* n
- }) M) j. I" v2 p
- public String getMessage() {9 p" G5 G d: e0 X/ \- d
- return message;
2 d/ x6 e; S* s X - }/ M4 d& W% C) p: i4 i
- - o# l% q4 r" J5 q: _4 T
- public void setUserName(String userName) {
# e0 g; d6 i, w4 v! S7 F* D2 C% |0 e - this.userName = userName;
# g5 C- y l$ H- a- X; ` - }
3 n0 {# {/ r$ z2 J
0 E1 e7 Z! G2 G, s) X$ r* V l- public void setPassword(String password) {7 i- r" S. h) @9 x; m5 K
- this.password = password;
: P( Q3 J# b) l- x( Q - }
8 ?! a9 d6 E! P. O D& [ - }
! m; F9 A2 f( q8 g U/ w: h
复制代码 8 p/ P& q a4 w+ l
; ]: s1 o4 v2 k! R* q
login.jsp7 o! N4 g( s' C6 m" a0 C
- <script>
5 Y4 |% Y1 G3 u$ K N8 Z" \2 M# c - var path = '<%=basePath %>';+ i; p+ G. K/ Q3 L
- function login(){
Q3 g& d8 i' B | - var username = $("#username").val();, Z( w6 Z& [% } x1 `9 A3 j
- var password = $("#password").val();7 E8 O8 V' j$ e/ w9 H5 S
- var data = {username:username,password:password};9 d1 S/ B; z$ o8 Y4 t7 v
- $.ajax({
8 G _( j4 w, @ - type:"post",
9 t; K3 C- Z k - url:path+"userAction_login.action",' n9 @# W: v9 `5 t
- data:data,) m4 ]3 }" k5 F+ B3 ^, _( o* p" A
- dataType:"json",: O6 _6 G/ C+ w; ]9 L
- async : false,
4 j! s4 |9 n! t% J) H7 \6 A8 k - success : function(data) {
3 E8 n3 S9 t( a" k# U) [+ `; Y8 x - if(data==="0"){6 v% B' h$ p9 R" u
- alert("登录成功");
4 j, z- r* L+ v& r$ D - window.location.href ="http://blog.52itstyle.com";
# s/ x5 z4 ^0 k/ b/ s - }else{
) ~0 y1 P5 K' J# N7 c - alert("登录失败");
6 P+ ~4 z8 D+ C2 Q3 j7 E u6 B - }1 }6 o* h5 Q9 ^3 ]
- }) c ]1 a$ v8 U/ m* F
- });% |5 O+ f- {% G7 i( u
-
m) z; A2 E8 e - }
0 ~$ Z9 n% C! T1 ?2 Z* _/ h - 4 K/ b1 ~% N, }# ]; V! ] o
- </script>
复制代码 ' z8 w: E- ^" w. b6 A% L% x. `
页面展示:
+ Q. b0 f; [) N. K2 E
$ E3 g2 w M6 S- j
8 Z" x! R+ o' F& O0 L) H- I" g8 g% C8 @) ~* c
基于Sturts2实现一个简单的登录功能.txt
(64 Bytes, 下载次数: 2, 售价: 1 IT币)
: m/ P& n7 t' d* H9 E0 F |
|