TA的每日心情 | 衰 2021-2-2 11:21 |
|---|
签到天数: 36 天 [LV.5]常住居民I
|
Sturts2漏洞百出,可谓是年年都会爆发一次或大或小的风波,但是即使这样,Sturts2还是有一批用户的。% m/ ]# [' W. E2 v6 f
花费十几分钟,简单的搭建实现了一下基本的登录功能。都是入门级的,高手肯定是不屑了,但是对于初次涉猎的小白们,还是可以提供点参考的。
5 {" ^& @- N: d) k# t# z
- v4 H: G% b0 W( r y( w; ?% h注意:
' a& x. Q8 D" j1 f+ ]+ d4 i0)项目Demo可以正常运行并经过测试- _+ ]9 X) Q. ?0 |% N3 ]; j B
1)代码是伪代码,自行添加逻辑0 Z) X+ i8 U+ g2 B
2)struts2-2.5.10 加入了Action验证,注意 struts.xml 中的 <global-allowed-methods>regex:.*</global-allowed-methods>
; T e( e6 k g2 X, ~3)struts2-2.5.10 拦截器修改了路径,注意web.xml中的配置4 a0 Q1 k# d4 b6 t
4)本案例,返回采用json数据的形式,使用struts2-json-plugin-2.3.20.jar,json配置见struts.xml 全局配置。6 X7 F5 C2 q" v# R
/ Z3 o9 U, M# z& i [" ^& U6 p' M2 ]! |一、项目搭建(使用最新版本struts2-core-2.5.10)
3 R* j, D7 b, J. |- B5 G7 c ^0 T8 {4 b* m& B- p( D% h1 e
1、相关JAR, v, j1 [" O f. y
commons-fileupload-1.3.2.jar4 I P, O! D8 q9 q+ Z0 G- p
commons-io-2.4.jar- H! l6 t% X" x I$ t) L! A
commons-lang3-3.4.jar/ E* r9 u2 N& U! x/ C& ]1 S, s; ^* ?
commons-logging-1.2.jar
+ w5 l; \# m0 h2 [4 S5 X( sfreemarker-2.3.23.jar
& R% |2 N" C- Z1 @* ~. K% mjavassist-3.20.0-GA.jar3 r4 G. b6 n; g- }5 J
log4j-api-2.7.jar. D, ~8 K- n+ c% x
log4j-core-2.7.jar
8 C6 i3 R# Y) B% m& a) vognl-3.1.12.jar
. E8 Z) u; m' K9 C* [4 @3 Fstruts2-core-2.5.10.jar
8 Q K) I8 |# q2 q1 A: _struts2-json-plugin-2.3.20.jar
% u- R# c7 G5 T/ J( Txwork-core-2.3.31.jar' r4 X( U8 b' Y+ a8 ]* [' v8 r
2 |# V) g0 `: l5 z2、前端框架
) B8 Q" |7 l( h# H5 F7 NJqueryjquery-1.10.2.min.js$ r" v+ d' h" |, N D# a5 x
bootstrap.min.js
5 f* ], I5 X" S, h; Z c/ i3 h4 n/ i. _8 B# J! l# m* s# r2 B
3、相关配置:
* z" _7 l9 N, f- z* y" Mweb.xml
9 _/ b& I" c! z6 t; o2 X5 R- <?xml version="1.0" encoding="UTF-8"?>
$ w- O/ S) n/ c3 E4 M - <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" >
+ I7 n5 a: ^0 Q! [! r, b7 A - <display-name>struts2</display-name>
8 x+ w Y1 u3 W$ }6 s, P5 y - <!-- struts2配置 -->( U6 F& t0 o4 X D) `' R
- <filter>
( ~4 H/ D! k5 y' f- M' H. c - <filter-name>struts2</filter-name>
7 a6 F/ P- t& y# e - <filter-class>" H- H% ]# @$ S3 Y" v @% x% {
- org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter
/ m0 K: V! p9 Q - </filter-class>4 w! f) F) {0 E5 u
- </filter>5 K3 L/ A m+ b5 ~$ S" |7 }
- <filter-mapping>4 d! {0 C+ L+ }3 B* S+ v7 g5 w
- <filter-name>struts2</filter-name>
0 p8 k! [0 Z$ f! q - <url-pattern>/*</url-pattern>
/ q: m! D: L+ b c2 O - </filter-mapping>
+ t I3 y! `" O4 v: E - <welcome-file-list>1 W$ j+ h0 V- l, ~
- <welcome-file>login.jsp</welcome-file>
2 x* J' K3 k7 M7 \, c* v - </welcome-file-list>, j" L: @9 W: @
- </web-a
复制代码
! x/ Y. G1 \' h( t2 Cstruts.xml
6 u3 z$ s! p1 ]( H0 U5 i) X- <?xml version="1.0" encoding="UTF-8" ?>) U3 ^& [9 S2 j' q* u
- <!DOCTYPE struts PUBLIC: O# M) Q6 u0 m7 Y+ c" u: t- B. z
- "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"5 W& {' E1 b/ Z; W0 r) l
- "http://struts.apache.org/dtds/struts-2.5.dtd">: A6 ^, U/ X1 k1 }& X" M8 c& f
- <struts>
3 l! h0 B, c# }" h. G - <!-- struts配置文件改动后,是否重新加载 -->9 R; D& k7 j# X: v' u
- <constant name="struts.configuration.xml.reload" value="true" />
% h6 R" |% v+ z U, ?4 e - <!-- 开发模式 开启它则默认开启了i18n.reload、configuration.xml.reload 上线后要关闭此选项 -->
, w' C5 ]0 v5 j; H4 p& n - <constant name="struts.devMode" value="false" />
; G% J( c1 v) C% i - <constant name="struts.i18n.encoding" value="UTF-8"/>
" c" W. C5 O" R0 e2 _4 E0 g7 A" s6 A - <constant name="struts.multipart.maxSize" value="1073741824"/><!-- 上传文件最大值 -->
" C0 ^' Z9 o/ D8 B) T4 { - <constant name="struts.custom.i18n.resources" value="config" /># ?; N, P. m! |
- <constant name="struts.action.extension" value="action"/>2 c9 S) A3 f: t2 N' @
- <package name="struts-global" extends="json-default">1 ~/ p6 [3 Z' W N1 \
- <!-- 配置Json输出 配合使用 struts2-json-plugin-2.3.20.jar 后台配置 message -->! V4 k* c, E3 F0 |/ h0 e5 p/ r; k
- <global-results> # v4 b: k0 b, z* Q
- <result type="json">
: Q0 {2 u: K6 n8 Y - <param name="root">message</param>
; K; P* r* D; U - </result>
$ @: g% g* d# T+ H2 y - </global-results>
) F R) ?! Y B$ i - <!-- 2.5.10版本 匹配 -->
2 p/ @: z8 ?! N" A - <global-allowed-methods>regex:.*</global-allowed-methods>
9 }* ?3 \ w6 q: ^; h- f& Z5 I - </package>8 R+ T) b9 y% e0 c4 I
- <package name="user" extends="struts-global">% |6 s) U& |6 h& Q! l: ^
- <action name="userAction_*" class="com.itstyle.web.user.UserAction" method="{1}">! ?4 F$ S; J, ^! W$ I
- <result name="logout">/login.jsp</result>; k. }+ G& h0 W$ \- w
- </action>
$ T! A$ J1 t% ~' H: n! j! t - </package>4 h7 U9 p8 I% O- _" }
- </struts>* V" Z! G% T7 a1 V
- 3 x1 C& G- ?( q- L# f. f5 O
复制代码
5 u, R" H' c* z6 q# n5 p/ H" ^$ B* s4 H% K8 {* l: d
UserAction
( u: ^* q+ h2 b3 m4 t5 a3 c- package com.itstyle.web.user;( w) P- q0 _: G8 g" L: h, \8 o: q
- & ?. \& p, v4 v
- import com.opensymphony.xwork2.ActionSupport;
/ H7 ^' i# b' `) {- | y3 j& N+ m - /**
0 f/ L4 T4 [: K: Q0 c. v - *
0 K+ c9 {+ I( r; N6 [ - * @author 科帮网7 L* P7 e. J p5 d# u
- *
$ u/ ^$ D8 p* ?' O) y: T4 ~5 Z - */; z7 G! T6 V/ `, r& C# x. }# c
- public class UserAction extends ActionSupport {( y6 @! o9 v% Y8 i& a% K
- private static final long serialVersionUID = 1L;
& ^4 c! v2 h0 i& S) _ - private String message;2 h& A$ t( ]$ A4 A' {* ]
- private String userName;
/ i h6 ?# O4 k3 E$ m4 k+ d - private String password;
: S2 S9 a) j: B0 Y) L8 @( w -
" Q# J, f( p- S+ v& f) j) R* M3 w { - public String login(){
, a z4 W1 Z( T. m - if("admin".equals(userName)&&"admin".equals(password)){
& z, I' g0 a5 `5 _- } - message = "0";
/ o h3 o2 z1 y# |4 q9 y! n - }else{9 I. {, h- h2 L, I
- message = "1";
* e) q* i3 F8 l- K - }0 R! U z4 Q4 y; \9 g
- return SUCCESS;
; M9 V: W8 K9 T" L3 W3 U5 ~ - }
* w2 p3 ]. b! b" h -
. x2 d$ {3 n% j9 p% h - public void setMessage(String message) {
4 r+ n' l# a. c6 s6 ^( M - this.message = message;
' _2 L) d7 o$ c% R/ w - }
6 ~* U" d/ A6 j1 { - public String getMessage() {% [& k& g5 A/ g( F; P
- return message;
5 N1 J& n" D% K Q, Z$ j8 M: Q - }* F; Z1 @5 t# K4 W7 ^- @
* i5 W& s) e% P4 _2 @/ C9 f2 g/ O- public void setUserName(String userName) {, s1 N) U. S3 n2 n) m
- this.userName = userName;
) ], ^" R5 a& M: ` - }" X5 B6 M v, P, i0 O+ M- t
( j3 Y' ]) I" X- public void setPassword(String password) {) E: i, p& A7 C" v- B- c; F
- this.password = password;' I. _* C- y2 G( Y! ?+ x9 K
- }
; L$ H9 }& P; v, M( q! f - }
% g# {1 d( B3 Q% x" V4 }
复制代码 & M. x6 j# _# |9 b/ u+ l2 z' C% O
/ ^! T+ s- n! W1 t m5 Q/ C
login.jsp8 R+ s* T& N2 I& W- K4 R
- <script>
1 ?6 X+ v( B3 N' W2 e) c - var path = '<%=basePath %>';
) }* R. f3 a; h' F5 M, p - function login(){9 `1 c7 Y) q( R7 b& T+ c, p6 n" }
- var username = $("#username").val();' u8 d/ F0 m- x0 S4 ^8 G
- var password = $("#password").val();4 |( S# t1 }; Y! T, `3 I
- var data = {username:username,password:password};
$ h% Z0 _' f B8 U6 Y7 K) a5 q - $.ajax({
2 y" T2 ]0 x* ?$ V2 n! ?/ E: w, X" G - type:"post",
5 ?, Q l& u* k0 Q' L/ L: L) {7 | - url:path+"userAction_login.action",) O4 ~! G6 r; m V
- data:data,
; q0 q+ n% r( u9 \/ p2 T! T/ { - dataType:"json",' Y# S2 K! o/ Z/ A4 O
- async : false,- b7 A* |9 w0 ~' K8 B7 M
- success : function(data) {
3 }( R, X& c4 x7 T' I - if(data==="0"){+ S) Y m' ~3 Q4 s% F% u
- alert("登录成功");
+ {; U* W; g* t% t - window.location.href ="http://blog.52itstyle.com";
. L P. e$ D; v$ o# ~6 m% Q - }else{
7 H a) ~9 |. m& i D( N - alert("登录失败");: R8 m( Q! c+ ~8 K8 H, e
- }
$ v/ `/ C1 E& ~- l, V& d - }- N: F- W6 s7 W3 f, d9 b
- });
3 y$ T( z/ `& G+ h3 q% D! f -
/ F: _& K- ~' y - }
! i7 ^2 C7 I$ w$ h( A' E. q; ]
% k- Q" T/ V4 r/ J- </script>
复制代码
. X$ B4 }/ p, G页面展示:
& }9 ~/ C' B. f/ ?/ s! s" S! F1 c2 W
/ K* }" X3 N5 A2 \ F
( y+ }1 \/ b4 b! R
基于Sturts2实现一个简单的登录功能.txt
(64 Bytes, 下载次数: 2, 售价: 1 IT币)
. V# j) } V c, t* J
|
|