TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
Sturts2漏洞百出,可谓是年年都会爆发一次或大或小的风波,但是即使这样,Sturts2还是有一批用户的。" S* [' J6 P" u) k1 g
花费十几分钟,简单的搭建实现了一下基本的登录功能。都是入门级的,高手肯定是不屑了,但是对于初次涉猎的小白们,还是可以提供点参考的。
% x2 [" S& p* l$ C. W* w- ~9 {4 f2 }
注意:1 h3 W1 w! [# h9 v9 z* h8 W
0)项目Demo可以正常运行并经过测试+ W: f4 K3 n8 e+ r/ D. b U6 o% X
1)代码是伪代码,自行添加逻辑5 @: T% M7 w" ]2 G
2)struts2-2.5.10 加入了Action验证,注意 struts.xml 中的 <global-allowed-methods>regex:.*</global-allowed-methods>' x! B j2 T H
3)struts2-2.5.10 拦截器修改了路径,注意web.xml中的配置
" I- W5 W/ m% b% M' }' A0 J8 ^4)本案例,返回采用json数据的形式,使用struts2-json-plugin-2.3.20.jar,json配置见struts.xml 全局配置。6 g( q0 a) j* Z5 X) e' @
. `$ l9 f, [# f$ ^
一、项目搭建(使用最新版本struts2-core-2.5.10)
/ B1 r5 v0 Q1 @% e9 E3 }- }
7 L+ j" g# q T/ z$ ^! o1、相关JAR
0 A2 K! x2 V( c5 ycommons-fileupload-1.3.2.jar
* x; H$ m+ V' }5 zcommons-io-2.4.jar6 w$ S& M2 H* r& H+ _
commons-lang3-3.4.jar
* i0 ? p+ |# ^# g7 Lcommons-logging-1.2.jar
2 w+ E8 \+ k4 Efreemarker-2.3.23.jar$ |- X1 t" y3 j
javassist-3.20.0-GA.jar' L$ g' F4 U/ {5 d
log4j-api-2.7.jar9 r, D2 h2 P6 y$ X7 l* \# [
log4j-core-2.7.jar, D+ \; q# q* d. ?& K& p
ognl-3.1.12.jar& G2 t5 w ]4 t. [. E
struts2-core-2.5.10.jar
) H; c# _7 c5 s* s% q3 Hstruts2-json-plugin-2.3.20.jar, J5 s2 A. r1 \
xwork-core-2.3.31.jar! M) A6 V" V* B* F' Q
: Z! G' X: p7 [: r- n
2、前端框架
5 M0 T9 O! Z `* |& F) i& tJqueryjquery-1.10.2.min.js
! P0 b/ X" V/ Z q5 }bootstrap.min.js) A- b; H* n& \# a$ ^; B
0 q$ ]( |' Y5 q( |2 p3、相关配置:! d5 T' T8 }% F+ b4 s$ M
web.xml
4 G v2 k& }* u. ]" |8 {( L2 h2 k- <?xml version="1.0" encoding="UTF-8"?>, F7 A2 [7 `/ q" F; ^: v1 R ~
- <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" >
9 R5 b+ [1 i- S! x' L0 D - <display-name>struts2</display-name>
' [% Y/ M! a; K* S - <!-- struts2配置 -->
2 m+ G# L5 ?3 O9 B. M - <filter>2 v( E1 j: J3 H6 @; v
- <filter-name>struts2</filter-name>) I- W& W! N2 C; T' L4 h
- <filter-class>
' K$ r) `5 X# Y' E! h1 c# H - org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter7 _8 {, v% M. g7 E
- </filter-class>
- W/ o c( K$ q8 p- [ - </filter>
Q, W9 H" [6 p0 C% B% d3 ?4 A3 Y6 V - <filter-mapping>% u9 s7 J+ C& o: D L& d
- <filter-name>struts2</filter-name>
, C) Z! W8 e' L$ A - <url-pattern>/*</url-pattern>
- i0 _$ d. U; g9 O0 d7 \0 \ - </filter-mapping># o8 ~6 X* K! F0 @4 g X( n
- <welcome-file-list>
$ l. c) n# x' [ `3 H' _& Z- [- z - <welcome-file>login.jsp</welcome-file>0 G w) U/ p" Y+ j% B# b" D' U! v/ q
- </welcome-file-list>
3 g) s9 \# Y0 E9 w9 L - </web-a
复制代码
7 V! f. S; X, K; }5 c0 }struts.xml8 a( f3 q- K0 f) v- z; L$ [
- <?xml version="1.0" encoding="UTF-8" ?>! F' h: A) [* X) X% D0 ]/ I
- <!DOCTYPE struts PUBLIC
: k P9 t- f( ^ - "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"! @" ?) S- g5 Y* J: N' R( J1 m
- "http://struts.apache.org/dtds/struts-2.5.dtd">
$ l$ R+ E" @; p% q) P8 p6 Z - <struts>" z& w( C$ P( c5 H' g! m- ^' u* Y/ U2 x
- <!-- struts配置文件改动后,是否重新加载 -->
) A) {4 f% `( u; i! v# ^5 U - <constant name="struts.configuration.xml.reload" value="true" />, l8 E: D: b' h! c% }
- <!-- 开发模式 开启它则默认开启了i18n.reload、configuration.xml.reload 上线后要关闭此选项 -->9 T6 o3 _, p0 I( V
- <constant name="struts.devMode" value="false" />
* Y9 ~0 |8 N! S* S$ n - <constant name="struts.i18n.encoding" value="UTF-8"/>4 g8 V6 x! ]7 l z) i
- <constant name="struts.multipart.maxSize" value="1073741824"/><!-- 上传文件最大值 -->
7 A `0 Q$ `1 ^2 I: N - <constant name="struts.custom.i18n.resources" value="config" />% T( D5 ?8 R- y. }! T
- <constant name="struts.action.extension" value="action"/>7 b! F1 |* [0 a) ~/ `9 b6 R
- <package name="struts-global" extends="json-default">( O" D W( v9 D# t, F& [
- <!-- 配置Json输出 配合使用 struts2-json-plugin-2.3.20.jar 后台配置 message -->- b% k$ ?- _4 t7 ?4 G
- <global-results>
1 m( W$ l2 N7 _+ k - <result type="json">
4 H/ ^4 B* X3 I6 {. L/ ` - <param name="root">message</param>
8 R! ]2 ~! @( d; Y3 z9 H - </result>
) ?! c, ]* I5 E; w" Y - </global-results>5 ~' @0 s. ?0 |' \; D! U3 [
- <!-- 2.5.10版本 匹配 -->" B: O* @2 ~4 |1 U& J6 E
- <global-allowed-methods>regex:.*</global-allowed-methods>
7 _( a5 ~% N% h8 {% a - </package>
, J9 s1 j* L+ v - <package name="user" extends="struts-global">
3 ]( p3 c! P" l b8 x9 \" o) P - <action name="userAction_*" class="com.itstyle.web.user.UserAction" method="{1}">& h$ o4 b: Z( [% x6 D
- <result name="logout">/login.jsp</result>
3 D3 k6 a6 [- g! ?" u/ O4 F6 j; ~ - </action>, X8 ^: y1 B0 }+ V* R
- </package>/ H- ], N5 D( T
- </struts>
9 w! |4 M9 p2 `3 G9 v2 d5 K - % N# }/ t" f' @: C: u
复制代码
: ?3 g9 x+ y/ X- L0 i& m2 k1 O' K4 U3 f) N) f
UserAction
: \9 t4 g) d9 S p- package com.itstyle.web.user;
* U) v8 h, l1 o/ q1 b3 P B' r
6 |1 }, i" r3 p+ {" }0 W- import com.opensymphony.xwork2.ActionSupport;/ I3 M2 P/ x; n9 r, V* A' c
- /**% P% i1 d9 K0 D D# X
- * 1 l) w6 ^+ ]+ O% X9 {( }
- * @author 科帮网
% N4 m) R4 k# X7 {( k - *% ?- O, Z6 K8 X, P
- */
0 G3 {6 N( }+ ?, L) K - public class UserAction extends ActionSupport {
3 y3 }% H6 J8 T4 O; d+ n - private static final long serialVersionUID = 1L;
' X2 p$ V/ s+ B' `, M4 {+ h - private String message;
- ]( y1 |3 L: _# v - private String userName;
- I+ E7 X% @0 H/ c3 j+ M - private String password;5 n! T( Y/ c! Q7 W1 C, o1 K$ I
-
0 m2 K! O4 _$ n) z0 b- d - public String login(){
. f+ _: I7 d* C" g1 a5 @' ` - if("admin".equals(userName)&&"admin".equals(password)){' v# \* m0 a* N1 y
- message = "0";# U y+ T( G+ c' d+ _
- }else{: t4 }- p1 G0 T% h6 ~& X, I4 H- T
- message = "1";0 U0 x, h# O/ F- E
- }0 U! ~; [- k4 y0 w
- return SUCCESS;( e; r! P- ]- i9 ?: x! L' ^
- }
7 U/ c, }" c# g7 b3 H5 Z - % M% G l2 q" p9 v% W, g
- public void setMessage(String message) { w- o& ?: s# Q7 d5 z
- this.message = message;
# }: x5 n* w+ J# { - }0 X3 d# ^; F6 k3 B' B
- public String getMessage() {
( u" S- _" { B; r2 r8 F# r4 {. _ - return message;/ |' y. Z- i& b/ w9 J2 C
- }* w' q$ L/ ^: `; ^/ u& L. D
- 8 q4 {9 M8 g' L
- public void setUserName(String userName) {( _. H0 g+ ~" y, c! c3 [
- this.userName = userName;) K0 h8 }& O' S- h
- }$ c4 l& R3 F; V- k
2 p! H' t+ D( V9 D" T- public void setPassword(String password) {! R9 U$ |: `2 A
- this.password = password;. Y6 K2 @0 { X3 O- S0 B0 T
- }7 ?0 F1 |" Q" ?0 j; y) t9 }' t- a
- }$ H/ R' e( q& K, m" K) X
复制代码 : e( P3 W- [0 Y! I4 }0 M4 e
. @. Y1 S( v1 f" P& g3 y
login.jsp: O0 }3 s/ G3 d' [3 Q) c% l4 V
- <script>
* O/ [% O8 d4 G. C- _$ \' W# I - var path = '<%=basePath %>';
& m, C4 `* F- X8 \4 D - function login(){. ?% \4 j* a3 U7 ~
- var username = $("#username").val();
8 R. H# i9 q+ S9 \% {; I - var password = $("#password").val();
5 _; z0 ]1 D$ w5 T& [ _/ @ - var data = {username:username,password:password};% [% j1 a9 q* g+ {% G5 g+ M
- $.ajax({
9 v* [+ m! p$ @: a/ [+ z4 Z - type:"post",; g( t" O7 ~% e0 `4 }, j# m! L
- url:path+"userAction_login.action",
+ k: r3 e4 K, c - data:data,
- s. Q1 U% t# ?6 m7 o1 F - dataType:"json",
. M5 K* \+ w0 N% V. F* [- l - async : false,) A+ T. u! R) X) ^; k6 S$ f' ]9 G
- success : function(data) {& ^$ t+ s9 U& j7 Z0 n, X
- if(data==="0"){3 ]4 N$ f% I. a) ]" R
- alert("登录成功");
2 |1 {# m, |; T9 ?1 }9 o; e- T - window.location.href ="http://blog.52itstyle.com";
. u- ~1 A% v8 t - }else{/ U' K4 n; @+ l6 D
- alert("登录失败");
' @ t a p; F) I0 o8 Q - }
" Q% Q( k! I b0 ]% @ m - }
# T$ D2 c f H5 s. T I$ { - });* w6 B6 h; Q' y% s' W: ^) M
-
( F+ e# i$ h1 Z9 j, y - }
4 R2 n6 |2 g% u - 4 b# R" H& b3 Z/ p3 E
- </script>
复制代码 3 f8 b2 A4 y4 g
页面展示:/ h6 g, F4 D( r( l. m. V! E
: ?7 Z: C- t0 T3 ?1 E
! N0 \" m) M( d7 a- z+ u, R$ E6 ]' l2 K' Z/ `) \
基于Sturts2实现一个简单的登录功能.txt
(64 Bytes, 下载次数: 2, 售价: 1 IT币)
: x1 k2 l( ?, w* H7 V
|
|