TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
Sturts2漏洞百出,可谓是年年都会爆发一次或大或小的风波,但是即使这样,Sturts2还是有一批用户的。
" n. [! Y; |- J; G花费十几分钟,简单的搭建实现了一下基本的登录功能。都是入门级的,高手肯定是不屑了,但是对于初次涉猎的小白们,还是可以提供点参考的。( ?$ S u' a6 f) ~* u ?
3 _7 w& ?. C( |2 Q3 M: h
注意:; B$ Q/ W5 y: Z
0)项目Demo可以正常运行并经过测试
& j4 J- f+ r( D& v) R$ Y: O1)代码是伪代码,自行添加逻辑% e& j! I* X. N9 S4 W; I+ F
2)struts2-2.5.10 加入了Action验证,注意 struts.xml 中的 <global-allowed-methods>regex:.*</global-allowed-methods>1 ^& K/ p6 ~" B# p$ I
3)struts2-2.5.10 拦截器修改了路径,注意web.xml中的配置% I! P+ r; P: G5 {6 k
4)本案例,返回采用json数据的形式,使用struts2-json-plugin-2.3.20.jar,json配置见struts.xml 全局配置。
" y) K4 X5 v5 o, C6 ]; H* v3 v) M5 X5 o, d) t( |) v: ^
一、项目搭建(使用最新版本struts2-core-2.5.10)8 ]; K( \# c/ @% Z
$ }, T* @- m+ u6 u* Q" L
1、相关JAR! T9 a. K8 R1 z! ~
commons-fileupload-1.3.2.jar
: v6 Y" z3 M8 k" pcommons-io-2.4.jar/ I3 o2 e+ @1 s" G7 A
commons-lang3-3.4.jar5 b& ]+ P8 h/ S
commons-logging-1.2.jar
# o0 q: d& ~+ ~+ s; R; Q$ Qfreemarker-2.3.23.jar! S, {2 Z$ [* B+ ~2 {5 a: K( ]
javassist-3.20.0-GA.jar
+ |1 U" V _1 B9 flog4j-api-2.7.jar- {" K0 Z' `, ]4 T% @' U9 h
log4j-core-2.7.jar: P' K# X! G5 c4 ^
ognl-3.1.12.jar% N3 x E" V. `
struts2-core-2.5.10.jar
) i% W( O b) G& o% y9 istruts2-json-plugin-2.3.20.jar2 L) [$ f8 M: e% _
xwork-core-2.3.31.jar2 V. |; C8 Z% a/ B! A
" d* ?. S& g/ h6 W. A% e
2、前端框架* U2 n) C% I8 A3 q, Q
Jqueryjquery-1.10.2.min.js
+ G% }# b. z* _6 a. Z" }! ?bootstrap.min.js
7 `( J8 P* X' I0 C' l2 I! u/ N2 X6 W1 \' V1 P
3、相关配置:6 V9 _( g: w' m- C7 S: y' [
web.xml$ d% ?3 l0 R( b5 o
- <?xml version="1.0" encoding="UTF-8"?>
9 F; s: i+ J. q+ h! }4 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" >
: o1 \! T1 w0 Y( ]1 ]) q - <display-name>struts2</display-name>0 g9 x9 q# t& c, K* L" u1 w0 R
- <!-- struts2配置 -->
: w0 j: y/ `1 L p1 ` - <filter>' I, K* }, _# t& x0 T) s
- <filter-name>struts2</filter-name>
' T5 B7 d+ K6 m+ @5 J8 ~" X - <filter-class>
! s7 M* c( M5 {& H3 I, V; o - org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter
# J2 r6 H/ R9 V# t$ U - </filter-class>0 L+ V- K" ?# ?( e% c* |
- </filter>" I$ ?/ G! @% i, K% E' v) w
- <filter-mapping>
/ u0 @4 k7 L" | - <filter-name>struts2</filter-name>
2 y1 O+ H/ U* [: d# y - <url-pattern>/*</url-pattern>2 u! \% C9 \6 ?6 y
- </filter-mapping>
- \' ?* S( @7 Z4 z) w - <welcome-file-list>; e: g3 G0 S, O6 o
- <welcome-file>login.jsp</welcome-file>3 d3 ^6 k* q' `1 B, m- i2 c
- </welcome-file-list>
% Y) M8 i- ?! u6 O" m9 A - </web-a
复制代码
) V' T& a8 A. }$ A* {- [9 }struts.xml
R+ w! R5 }9 X) I% X- <?xml version="1.0" encoding="UTF-8" ?>
/ O/ x8 S3 o8 J' U - <!DOCTYPE struts PUBLIC
% x0 s. Y5 e$ @! a7 s - "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
" ~. M( h. d i - "http://struts.apache.org/dtds/struts-2.5.dtd">8 l$ K" r, Q6 c4 X4 \
- <struts> a2 N& x% Q0 l8 G+ a' _
- <!-- struts配置文件改动后,是否重新加载 -->! j' s2 u! g8 t; B% S' {
- <constant name="struts.configuration.xml.reload" value="true" />
1 \4 L" V+ N8 Z* L! q/ k - <!-- 开发模式 开启它则默认开启了i18n.reload、configuration.xml.reload 上线后要关闭此选项 -->, V) L' V. r7 Q- I/ T+ b
- <constant name="struts.devMode" value="false" />
+ a) T# t, t; {$ U# y5 f) V s% G - <constant name="struts.i18n.encoding" value="UTF-8"/>6 H) F4 ]; V8 D& j8 y, D
- <constant name="struts.multipart.maxSize" value="1073741824"/><!-- 上传文件最大值 -->
+ g: C6 k; n/ f2 f& F - <constant name="struts.custom.i18n.resources" value="config" />5 E: T. H- i1 m1 m! W
- <constant name="struts.action.extension" value="action"/>
; ~4 t: E8 ?2 o; W; Z" p3 {$ ] - <package name="struts-global" extends="json-default">
' r0 b) b# u. E, X- ?( ? - <!-- 配置Json输出 配合使用 struts2-json-plugin-2.3.20.jar 后台配置 message -->6 [. v$ k# @# m0 p7 d3 l, w% H. i
- <global-results>
. v7 k( t/ R; {/ y; l' b" n - <result type="json">
5 o) C* H9 v; `; a) O* `$ J3 U3 u - <param name="root">message</param>
( h; S8 `) A; |* y6 I - </result>* _) X3 ?5 K3 L0 i: Y
- </global-results>
( M3 U% h7 T; F: w- j - <!-- 2.5.10版本 匹配 -->! h, J# N" G3 ?8 M0 G
- <global-allowed-methods>regex:.*</global-allowed-methods>
* Q9 Z- Y6 M) x( ~ b+ ^ - </package>
* v1 G/ a$ t- p - <package name="user" extends="struts-global">
- x, Q- _& t4 C" f7 \ - <action name="userAction_*" class="com.itstyle.web.user.UserAction" method="{1}"># b- u) c: o/ ~6 L+ |
- <result name="logout">/login.jsp</result>
3 r& x, g0 P" W8 W# N - </action>8 s+ Y C4 D- H q* c6 K W
- </package>) J9 K1 \! ?: a' a3 S6 L8 {2 \
- </struts>
% Y, m! m! k; X$ x
3 j# ]2 y) z7 Z. j4 b. e1 R8 l
复制代码 8 v) f8 e9 T! t3 U
2 J# S" Q& t' d; N
UserAction* E2 ~7 T* C2 |# L7 y
- package com.itstyle.web.user;. `- J! @) R |* v- W4 T" s
2 K- f% n! ~5 }( ]; i- import com.opensymphony.xwork2.ActionSupport;/ O# e I. a% n0 t3 X% t
- /**
2 O, N/ d3 G" b8 p5 J$ J+ _* W) U1 e - *
* w! C! j) s: A - * @author 科帮网
5 E* m. M$ ]) m1 @ V - *0 J& \# ?! A7 f
- */0 x3 U6 k& X1 X6 l! b
- public class UserAction extends ActionSupport {
`9 r4 ]! `! k3 Y* Y; Y0 N - private static final long serialVersionUID = 1L;
% ^8 S3 p* C* w, U* Q( n. p8 L - private String message;4 Y" J( t7 |) c( O# W1 p
- private String userName;
3 H, z; V) f5 f8 `% f1 Q - private String password;
; V6 I _ s3 r1 U5 ~% u5 Q -
/ ?7 s. D$ x& R- h* u& Y - public String login(){ h( K5 T, h3 M/ t1 }4 T9 L
- if("admin".equals(userName)&&"admin".equals(password)){. p q0 E4 v2 B4 W9 ~
- message = "0";
& s- |4 n. Z; x) Z - }else{9 b0 E7 J4 ^8 S; F8 q5 k8 i
- message = "1";% ~" Y6 L5 v8 W; X3 _
- }
8 C I0 n& x; Y; C* R9 x" A - return SUCCESS;6 M9 A. [, s1 r8 h
- }4 u$ l7 Q2 r) e: Z/ v- l
-
( x: n1 s' H% V, Y) }& [ - public void setMessage(String message) {
, R8 k4 i. f& @7 p" w - this.message = message;) o4 f! g7 `' [+ @2 ~, H0 i6 r0 \
- }
6 k. ]6 _9 g% @2 C7 t7 u" f4 C1 @+ p - public String getMessage() {7 c7 {# z: C$ [9 d( [* Y
- return message;* n& G: l' q6 m% u% ]
- }
8 T& }8 ~1 r% V4 q& A5 e% _ - & e5 U& b3 e2 } P B
- public void setUserName(String userName) {
5 f+ h& G# J8 J/ j8 C* u9 ] - this.userName = userName; n! w* v/ K7 w: m7 q7 {
- }
7 w/ J6 z4 G$ R
0 q9 C7 L' m. S0 ]- public void setPassword(String password) {( m/ s3 z$ V, m: h- G; j" I+ a
- this.password = password;
# y- W4 L) X+ t$ m! O - }- H, ~- I6 I% V' O" g& T
- }& U' C) R: ~6 E( x, K+ i
复制代码
' w% d4 x$ f* V I- H9 }- T D5 x) P3 e
login.jsp* @+ ~& K$ f9 k+ w. d$ X
- <script>
8 A! {2 R$ L: ? - var path = '<%=basePath %>';/ N3 h$ Q* m7 X" s& v
- function login(){# a! L7 J# w W; |( X5 n1 |' f
- var username = $("#username").val();
% W$ k, _8 o) V# @% W- v - var password = $("#password").val();0 O' c( I6 m2 X+ n5 N, A8 A
- var data = {username:username,password:password};
/ h. w# O7 F. V - $.ajax({
: M9 L4 Q, z2 d! d: v$ n( E - type:"post",
P9 ?& q6 k0 R8 w9 ]3 |9 ?2 D, Z) X - url:path+"userAction_login.action",' j& W! ^( ?" v+ x' R9 P& W
- data:data,
( `4 Y* y5 Z" _6 s! z7 T: ^ - dataType:"json",
- X, T, H9 `& q - async : false,
7 Q4 f* Y0 @+ B6 O5 @& H) r1 X2 F p - success : function(data) {/ n8 ~* I6 | f* c! u5 ?, L' {
- if(data==="0"){
0 ~* T7 L8 G3 I. i - alert("登录成功");/ Z6 @0 R- F% n4 h! S1 `
- window.location.href ="http://blog.52itstyle.com";
% e& ~* R* k6 f$ t J* z6 C - }else{, l; ?' t, M2 k- n! }
- alert("登录失败");% m- m3 o% x: I1 r+ l
- }
6 Y6 E4 x" \% T8 p - }8 A' H; N9 f8 g
- });
% E6 _' l" f. K4 n2 K0 | - / y" S+ L4 i- `4 e. h
- }- j3 z, P0 @& k0 J( {
- # c Z( P$ ?4 y0 h# g9 {& s
- </script>
复制代码 9 a& t/ ^* V- i2 P
页面展示:% K: O; n. Z: J4 M6 |+ t& V0 z: Y
3 x5 j; v* J# w3 f ]
1 a4 k5 A$ M* E' S$ p& B i7 a& @8 K
, O0 w' }% u1 l) ]/ I; f& ?
基于Sturts2实现一个简单的登录功能.txt
(64 Bytes, 下载次数: 2, 售价: 1 IT币)
& v' N$ ~8 N9 g* f |
|