TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
Sturts2漏洞百出,可谓是年年都会爆发一次或大或小的风波,但是即使这样,Sturts2还是有一批用户的。4 L0 e- \( ?( ^& C
花费十几分钟,简单的搭建实现了一下基本的登录功能。都是入门级的,高手肯定是不屑了,但是对于初次涉猎的小白们,还是可以提供点参考的。+ b$ L! r* C3 m0 _' w
r1 |# ~- q& n' n, Z7 K$ y4 @' m注意:8 R2 b; [+ g* W7 z( U- B) C6 E
0)项目Demo可以正常运行并经过测试
. Z' |) u r4 Q1)代码是伪代码,自行添加逻辑
( Y( l1 g% v; u2)struts2-2.5.10 加入了Action验证,注意 struts.xml 中的 <global-allowed-methods>regex:.*</global-allowed-methods>/ r. \& f! [3 S
3)struts2-2.5.10 拦截器修改了路径,注意web.xml中的配置
) D3 O7 F( @5 y( @6 _4)本案例,返回采用json数据的形式,使用struts2-json-plugin-2.3.20.jar,json配置见struts.xml 全局配置。5 N# z: H6 v$ H5 T% Y1 n8 ?
$ a' f8 h8 A! E
一、项目搭建(使用最新版本struts2-core-2.5.10)
1 T; `, `3 \; U) j. q( ^, d- V7 U" |! e
1、相关JAR7 K) L- Z7 y2 O/ b- }) C
commons-fileupload-1.3.2.jar
( ~4 {( Z0 @$ i& W9 h% n2 {' }- Ecommons-io-2.4.jar
" W+ S% w ?& [$ m$ G& H* I6 gcommons-lang3-3.4.jar
/ g- o2 m$ Y3 u% Rcommons-logging-1.2.jar1 h, o! v+ ?$ k9 c8 ~1 w
freemarker-2.3.23.jar
; P+ o4 B$ ?; ~: y' j, j* xjavassist-3.20.0-GA.jar- _* W4 c8 s% H6 m$ s
log4j-api-2.7.jar8 S# y. \. R0 g& C. k
log4j-core-2.7.jar; y1 f) X3 e6 j. T
ognl-3.1.12.jar
* `8 z1 g* p. o' A/ {struts2-core-2.5.10.jar$ K1 T, S0 S+ N* l1 c
struts2-json-plugin-2.3.20.jar
( Z" B! Z5 K. q& Uxwork-core-2.3.31.jar7 M# l# @) N" ?
( a5 r* G1 L% W, R1 p: X2、前端框架
# n" b# [, j% R9 F$ s1 W, e* j: YJqueryjquery-1.10.2.min.js. Z0 k F5 r7 {) i. P5 j1 Y
bootstrap.min.js* u) X) `7 [3 h: c+ g' C% n
: F! F% H. i: h6 F' R; t. [
3、相关配置:
0 n3 ~9 e3 k- g8 p% u- c" O2 Eweb.xml; I/ y0 ~1 R0 }. R
- <?xml version="1.0" encoding="UTF-8"?>) ?' e, l6 x4 n% q( F
- <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" >4 W5 l5 B2 P$ h& V
- <display-name>struts2</display-name>( W. ^ f }3 d# z9 P) j$ c q: {
- <!-- struts2配置 -->5 O0 }6 x4 y/ K3 l* D) A
- <filter>
, ?* B3 c$ s! j# P5 u - <filter-name>struts2</filter-name>2 y5 `% n' q$ H6 u& t( k; H' u
- <filter-class>
& X* E8 j$ V; D1 r - org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter c( o" z2 N0 P+ c0 f# L% u" j
- </filter-class>
! ]" ^( u6 O( W2 A' f- x - </filter>8 T4 d4 ?2 I& @: @
- <filter-mapping>7 D! D; m- l$ v0 B& g. i
- <filter-name>struts2</filter-name>1 b9 T3 Q3 { r) f7 B9 c( X) B
- <url-pattern>/*</url-pattern>1 F1 i( U6 ?1 {* ?3 ]
- </filter-mapping>
) B Y0 ^1 L; A - <welcome-file-list>
5 f) @/ s ^6 k( J" i( d - <welcome-file>login.jsp</welcome-file>
. q, }0 }; ?. U U1 c! T6 C' U1 a - </welcome-file-list> N6 q! h+ w$ k" w1 [4 R
- </web-a
复制代码
9 \7 [+ c% P( E; G1 B# b1 a3 hstruts.xml
" [( m- y, R5 W% A2 a- <?xml version="1.0" encoding="UTF-8" ?>0 D" K& C5 S0 P+ s) O: L4 _ _
- <!DOCTYPE struts PUBLIC6 r& J m! L7 }
- "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"! f+ F4 B' ]3 [& U e) R$ U
- "http://struts.apache.org/dtds/struts-2.5.dtd">
7 k) r7 J7 G8 Q- L0 P$ D2 d - <struts>
4 g/ k- d( J# b4 C8 k, \) H- K - <!-- struts配置文件改动后,是否重新加载 -->
7 m1 j5 v/ H! X' L4 G - <constant name="struts.configuration.xml.reload" value="true" />4 g A- |0 j0 [( T
- <!-- 开发模式 开启它则默认开启了i18n.reload、configuration.xml.reload 上线后要关闭此选项 -->( \0 K- J' d: j; K$ V
- <constant name="struts.devMode" value="false" /># O5 R0 w6 N+ b2 J
- <constant name="struts.i18n.encoding" value="UTF-8"/>* A: M7 G! o) p3 b2 }0 q4 v2 V
- <constant name="struts.multipart.maxSize" value="1073741824"/><!-- 上传文件最大值 -->/ a7 o+ Y3 b1 Y t( `- V8 Q
- <constant name="struts.custom.i18n.resources" value="config" />
, g1 c7 X0 B2 T* x$ D" J6 |% t) m' W - <constant name="struts.action.extension" value="action"/>% d! E0 q5 ?/ F5 T4 i
- <package name="struts-global" extends="json-default">
8 Q' w( j z0 q7 W5 @ - <!-- 配置Json输出 配合使用 struts2-json-plugin-2.3.20.jar 后台配置 message -->0 R# A5 J' U( K, U, g. f! |" |
- <global-results> % G. d2 W; k# o2 P
- <result type="json">
; H# @& k3 v+ T( u/ P7 A - <param name="root">message</param>- ~7 M' U# I) ~ e
- </result>
' C4 G0 z6 Q. [+ q* |3 p - </global-results>' {* H( t+ S% H2 X% P- o
- <!-- 2.5.10版本 匹配 -->
# u8 f2 d+ w4 ~0 ?. R - <global-allowed-methods>regex:.*</global-allowed-methods>
$ Z( i/ D' y6 [6 g' U3 } - </package>7 D5 f+ k1 X7 z( y' C$ a
- <package name="user" extends="struts-global">
8 M0 D$ H' J$ Z& \ - <action name="userAction_*" class="com.itstyle.web.user.UserAction" method="{1}">
& h6 f, Z8 m- F: l& O5 T - <result name="logout">/login.jsp</result>
r6 P4 G, G: Z" L1 Q8 U4 |+ ]2 S - </action>" k+ {6 C' T1 P0 l$ {
- </package>; u6 h% \2 r+ w9 R7 I6 c1 r
- </struts>
6 g5 ~" q P6 J' s' b4 B - 5 B2 l ?% v$ x/ I- J2 f
复制代码
5 [( Q0 g A u" b- K5 P. W0 H. d: R1 {2 T5 H( l9 a1 E
UserAction
$ @" u+ ` J" D( p& X- package com.itstyle.web.user;
3 s$ {$ G" g% ^% s9 C; h$ V' T - * s4 a3 E. y1 z2 M5 F
- import com.opensymphony.xwork2.ActionSupport;
, V) }. h, i$ Z2 P - /**# k& T" E2 p; M3 P2 B
- *
9 f: D* o* J( ]! a - * @author 科帮网% d2 N$ \3 Z/ h$ `0 I8 k
- *
: N8 @3 e2 j: L* ?$ W1 c6 i7 u' s5 f - *// L! }; u$ Y* h3 O: N
- public class UserAction extends ActionSupport {, P4 v! b! C$ E/ t% H1 L: k
- private static final long serialVersionUID = 1L;( y% e! F- D$ V( f* i
- private String message;
4 x) y) T$ I, C( U8 @' d - private String userName;
7 T" ]3 p4 \. s y0 m! I - private String password;" v6 U7 `/ V% ?* f% ] O3 Y: d
-
4 S$ T2 l M" b F, ~) `$ L- a - public String login(){* r8 E( t8 m) O9 I
- if("admin".equals(userName)&&"admin".equals(password)){
3 E3 k6 S; N; s, ` - message = "0";6 D- H6 b( i5 [, Z6 C! r
- }else{& m) P- w" g" |( Y+ }5 R2 B# y7 X
- message = "1";
4 b) w1 |: z4 Z) x- B: H) n! B: ^ - }
6 [; x2 B$ ^& g' {; \ - return SUCCESS;
$ I$ H0 U$ _! F+ S m/ y9 { - }
5 s0 H J4 l+ a: A2 W- r; S8 e - - g8 Y% P2 w/ ~. v& o
- public void setMessage(String message) {5 ^4 D2 R. a* J- t7 y0 x& d
- this.message = message;
) {/ R* f, g4 u% g - }
; A b% r4 ^# }( ^5 Y+ r3 Z) t - public String getMessage() {
( U4 e) f# E: j% n/ F) x% O% q7 X2 r - return message;. r$ }1 R/ l2 A
- } W* m0 E/ g0 G, m
- , _" L' V$ q8 E& P; J! e9 S: z
- public void setUserName(String userName) {
, ~9 Z% `# U2 L/ l. \) Q - this.userName = userName;- y% A V) g! h0 x/ a( Z/ ]
- }
$ X' Y+ i! A6 C) Y) P1 G - 0 P! \+ p% s- c" X ~( z
- public void setPassword(String password) {
! j3 K9 z0 r& r, o0 @8 B( W - this.password = password;
7 j$ x9 ^& B: l - }. M5 G4 T+ q) N0 Y
- }
. l2 e: p* G2 f! y+ ~/ l' q
复制代码
0 L6 u" P% j" \9 I
' P3 g5 P8 F! M$ ~/ Wlogin.jsp) |* L2 d8 }- C5 S6 c
- <script>
7 [: }& ?/ m" K0 v ^( S8 l) j - var path = '<%=basePath %>';: c! g( r. R4 d& ?+ p' |8 ?4 X
- function login(){
& u. w. I& d; ~4 [1 g" j/ f - var username = $("#username").val();
( N3 Q1 ?: f( q% _# T - var password = $("#password").val();
' k6 D9 H; |) X7 q% e# D+ \ - var data = {username:username,password:password};8 l8 Y8 [: i+ K) }
- $.ajax({
/ U* [/ R+ ^! \4 h# `8 F0 M - type:"post",
+ [" c; a# L/ V9 y6 h; b - url:path+"userAction_login.action",
1 C! t" ^1 q1 H; ?3 z - data:data,
& O6 { n. \ ?% u: N6 e - dataType:"json",
8 w5 I9 v6 |8 K8 v3 ?% o; Z - async : false,
) ?; D8 F" x' H8 [+ }) A - success : function(data) {& r. e! f) E/ l( `, a
- if(data==="0"){$ C8 n4 K; b" g! K# @4 h4 F( y
- alert("登录成功");
# C+ [0 o1 k3 J3 |/ e1 @& Z9 N; p - window.location.href ="http://blog.52itstyle.com";" i5 ]8 [$ L2 u6 U( e+ Z! Z
- }else{. ?/ B. U3 o) {% @
- alert("登录失败");
9 B- T# @7 {. E9 D# l - }
) N5 R& p3 P. d: {* n - }
L% o* s+ l7 Y7 t* L% N - });! h: w) M* G" `
- 1 Y9 L! g" H( a" C
- }
! I- [8 `- B6 C% }; o2 A% X! ~, j
4 ^8 ^, u3 b& ] u- </script>
复制代码
; L3 R' ~4 V/ Y4 E页面展示:9 i) g6 p+ a* F" |6 z/ R
1 y4 b2 W" h6 x8 I! L# @- G) L
3 ~3 r8 f+ Z+ z9 ^7 }8 ] n1 | J
8 {/ W, W" ~& \( M! D
基于Sturts2实现一个简单的登录功能.txt
(64 Bytes, 下载次数: 2, 售价: 1 IT币)
3 H4 m% V w0 \' Q |
|