TA的每日心情 | 衰 2021-2-2 11:21 |
|---|
签到天数: 36 天 [LV.5]常住居民I
|
Sturts2漏洞百出,可谓是年年都会爆发一次或大或小的风波,但是即使这样,Sturts2还是有一批用户的。2 ` @! z5 m0 ~6 k" f9 g
花费十几分钟,简单的搭建实现了一下基本的登录功能。都是入门级的,高手肯定是不屑了,但是对于初次涉猎的小白们,还是可以提供点参考的。0 ]$ X) f4 l/ S7 o+ p6 d) E
C! u! R' n8 p- q% T8 ~0 m, P" i注意:- Q: N- H7 H1 K' [
0)项目Demo可以正常运行并经过测试9 t: f( F& J8 r3 {( z& j1 t
1)代码是伪代码,自行添加逻辑7 J2 i! m' s, i: B+ t8 U T
2)struts2-2.5.10 加入了Action验证,注意 struts.xml 中的 <global-allowed-methods>regex:.*</global-allowed-methods>3 t5 ~7 h1 Q8 S' ^1 ^& ]# J) u4 Z
3)struts2-2.5.10 拦截器修改了路径,注意web.xml中的配置/ A; ]- Y6 {8 U4 v* D0 h
4)本案例,返回采用json数据的形式,使用struts2-json-plugin-2.3.20.jar,json配置见struts.xml 全局配置。
% J; C1 M/ n( @
- u5 i+ ?9 g ^- h+ v一、项目搭建(使用最新版本struts2-core-2.5.10)
, W: Y4 p' `# r8 z) z0 d1 m
6 S2 `9 f2 p- h+ @+ E. B1、相关JAR2 p& ~0 m# @$ ~! e
commons-fileupload-1.3.2.jar
4 G7 r) G$ I: S- hcommons-io-2.4.jar# }* F: Y0 L; a: [/ Y
commons-lang3-3.4.jar' o' D' y5 J2 r! X! K
commons-logging-1.2.jar
! p/ I6 n: }1 c3 t4 j9 i4 Qfreemarker-2.3.23.jar
. X3 h) d e* Y0 Q% ojavassist-3.20.0-GA.jar* a6 Q2 t& X7 n" M4 |, a4 M3 e
log4j-api-2.7.jar% o! J# h5 Z l% S5 F6 H
log4j-core-2.7.jar
' [/ W7 ]7 y, {5 ^4 qognl-3.1.12.jar2 h# v0 O, n, a3 d* l/ ^ o
struts2-core-2.5.10.jar2 u$ Z0 O) r% k3 l/ `
struts2-json-plugin-2.3.20.jar
: \4 c$ }2 L5 S' N" i' Txwork-core-2.3.31.jar+ C* J6 i: Q; D" a
+ F( D" N* p; v: s* S2、前端框架
) B% B2 P9 H/ H' n0 B7 SJqueryjquery-1.10.2.min.js1 [1 \/ D5 _3 a/ t) P
bootstrap.min.js- O3 [3 M) y! j) Q
2 |/ l/ p5 H6 Y. a _
3、相关配置:. r1 ? W7 Z/ t
web.xml
( v5 L! H1 U# N) m7 |. O- <?xml version="1.0" encoding="UTF-8"?>, x9 q, i' I2 h* _: v7 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" >6 |5 p% i' R) @5 X- j5 r
- <display-name>struts2</display-name>
# U) s C7 l: s - <!-- struts2配置 -->
: f* h& K7 F% y$ I. g1 v - <filter>3 w, q; L2 x# Y: d# E
- <filter-name>struts2</filter-name>
8 g3 t R( F/ B, `$ Z: q: @ - <filter-class>
5 l7 B9 Y& Y F - org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter
( b9 P5 H- U( c0 P& Q# ^ - </filter-class>
4 K2 h& G* I! u$ V3 b - </filter>
# Q$ t$ ^$ B3 E: j - <filter-mapping>( C6 H' ?0 i1 }4 P1 C% F
- <filter-name>struts2</filter-name>
# q- p0 {9 G- U4 a$ V - <url-pattern>/*</url-pattern>
7 u' t/ u! T% @/ h9 r/ @ - </filter-mapping>
2 }, J0 J) z5 _- O* S1 \ - <welcome-file-list>
- b8 a; N( n0 c - <welcome-file>login.jsp</welcome-file>
& t2 S% M8 G% i8 G; c1 j - </welcome-file-list>
1 ~* V- j- R3 s- K) u- t% u - </web-a
复制代码
' E' P D5 S. h: j/ Cstruts.xml; p: m$ w6 W @
- <?xml version="1.0" encoding="UTF-8" ?>
3 q+ R! I; n+ h4 ]5 Y1 o% \ - <!DOCTYPE struts PUBLIC
' y4 R" K7 Y; t0 X! s' r6 t - "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"1 c- O' q& Y( |7 B5 V
- "http://struts.apache.org/dtds/struts-2.5.dtd">; E6 V$ i$ ]# h
- <struts>% q( r9 h* T0 s$ F, ?, U
- <!-- struts配置文件改动后,是否重新加载 -->
% q5 m0 W' V" d! c# f - <constant name="struts.configuration.xml.reload" value="true" />) I5 a' p, D8 Z* k. @: t6 \
- <!-- 开发模式 开启它则默认开启了i18n.reload、configuration.xml.reload 上线后要关闭此选项 -->2 m9 i p* M% l4 G
- <constant name="struts.devMode" value="false" />2 g8 I/ i6 L9 F$ ` L: J9 l t
- <constant name="struts.i18n.encoding" value="UTF-8"/>* S' b" p6 i" N8 N0 n0 F/ }# ^3 U1 l9 b
- <constant name="struts.multipart.maxSize" value="1073741824"/><!-- 上传文件最大值 -->
6 {5 F `% Z$ X3 A1 j# c - <constant name="struts.custom.i18n.resources" value="config" />
/ Q0 l7 c% C7 T5 v% k- o6 k) ?# ` - <constant name="struts.action.extension" value="action"/>! o$ i: |8 L8 p7 ^* N. x! A, H2 U
- <package name="struts-global" extends="json-default">4 D0 P/ I( t$ ?7 C; P9 Y
- <!-- 配置Json输出 配合使用 struts2-json-plugin-2.3.20.jar 后台配置 message -->; R6 P8 b. E1 ]
- <global-results> 1 @: T5 f9 t+ e. N+ R- K. s; J
- <result type="json"> w3 U) v8 @" |0 p3 o
- <param name="root">message</param>
% p' U0 |- q) O$ V( Y - </result>
0 v& S+ }, E1 b: [, B - </global-results>7 r* u9 d+ _2 U+ T% _
- <!-- 2.5.10版本 匹配 -->+ [; M6 `( |6 I% \: g
- <global-allowed-methods>regex:.*</global-allowed-methods>
, @* i9 F4 s! D0 o' I( x - </package>+ X# P3 Q; P& U% \
- <package name="user" extends="struts-global">9 r9 g( P3 Z% g- T; H2 ?; O4 v
- <action name="userAction_*" class="com.itstyle.web.user.UserAction" method="{1}">
4 m: o/ C a' S - <result name="logout">/login.jsp</result>0 A; N& B q2 y1 V6 o
- </action>
' ^$ x& T/ o: {0 G4 ?) I: U - </package>2 a) D Q9 J5 R& s% d4 N, m7 o
- </struts>
7 c9 N" ` ?+ f: r
9 F" H E0 F$ {" A; A' |, G( M- R
复制代码
! s+ d( l! Z; N: c2 B6 O$ k# N9 F" h5 n8 q# L8 ^! h8 V* c! B
UserAction
3 w1 U( `% f( I- package com.itstyle.web.user;
' n) H/ t4 B9 k7 F - 3 n9 C# }' S+ c6 r4 t
- import com.opensymphony.xwork2.ActionSupport;- ~. Y- ?% z* C7 g0 m
- /**7 E! K. b/ ~! ~% x# {7 j8 S( ]
- * 6 y# I) m% a7 E( P6 [: Y9 S6 G8 _8 ?
- * @author 科帮网
: s+ d1 X" Z+ w5 {' {% E - *
6 h/ d! ^7 I/ }0 O7 [, M4 E% j - */, Y: P1 c0 }0 G4 l: }3 H
- public class UserAction extends ActionSupport {
3 j: w1 j8 l; y: \- b - private static final long serialVersionUID = 1L;
" A; l K2 y+ b" ] - private String message;5 R: b; }1 f5 [% @, E
- private String userName;: I+ t# n4 C" [6 y0 I- c
- private String password;& R+ ~6 U; Z- K0 V3 b+ w/ z
- # D1 W3 ~% m G& C
- public String login(){2 P9 E1 H4 X' k' x
- if("admin".equals(userName)&&"admin".equals(password)){
- `6 S e( I. K+ M - message = "0";
: ~+ Z Q# F, _, T; U+ b - }else{
& [8 A' w; G" X - message = "1";
$ T# e) K; A) z2 {( g6 { - }
- k! j7 @( O5 p, ^( Z- Z - return SUCCESS;* F. {1 N) [- K; v) }
- }
7 ~0 x+ l2 I) P. D" N$ x+ v -
& ]" t p/ q H1 d2 l - public void setMessage(String message) {- A, R2 n m+ C A; c0 J, H- w
- this.message = message;$ q0 d9 [; {0 o5 i) U+ f6 }4 S! `
- }
$ b( ^4 n" W$ [6 ^0 X, P - public String getMessage() {5 G8 P9 `: b( |/ t5 ?# k! K
- return message;
9 X, S: `& }, d2 q! c2 x - }
3 e! M; L7 l, \3 {
0 x+ U7 J2 H8 ^ P+ p- public void setUserName(String userName) {
) l; k) C% _" A& F, U$ H - this.userName = userName;, z+ Z/ m* T# C7 K) f3 V$ q- G7 k3 H
- }! T& |/ \1 H5 e: I i+ ^8 A! _' [
! X4 `, l/ O3 |& d6 l+ q5 n! g- public void setPassword(String password) {
/ ]7 G& o& k: q; W - this.password = password;) o1 H/ K3 i- @5 |5 @
- }
' Q& R3 k6 n( n, p - }& E( D. ?7 c; F x
复制代码
' s* [9 |& A3 x1 S# A( Q! ]+ d* [2 ^( d2 J! G. D$ I3 N4 A
login.jsp
/ U* T+ E, x! {4 A+ |+ q) N1 Q- <script> N( Q! o: p) }5 q0 n
- var path = '<%=basePath %>';
Q& E; n2 O+ Y& C4 q/ W - function login(){ h, ~" w0 K+ Z3 Q$ j' V. o- p
- var username = $("#username").val();
! R/ k, V; ?) a4 z - var password = $("#password").val();$ `& J; P7 a$ V5 X! W, g
- var data = {username:username,password:password};( C+ M- }! Y6 ~$ u. Y
- $.ajax({
0 h) w! V" V) \) x: _ - type:"post",
9 J( w: e& S# C! ^1 ^) E9 a - url:path+"userAction_login.action",
! N/ H% o+ B, g6 V4 L# E7 \/ \) l - data:data,) U& g! c' I6 r) ^
- dataType:"json",
$ l; ~. h& j7 N' a5 _ - async : false,
" G0 ]! S7 l& S- B% p - success : function(data) {
! D `% `7 G& y! t - if(data==="0"){: K% K" I! Q% @9 B! Y: e! G y
- alert("登录成功");
/ P# }! J W( {5 p5 M7 e - window.location.href ="http://blog.52itstyle.com";
3 e# J0 r& s2 R( Q) `) o - }else{
B" j$ h! H' ~* E8 ], g1 c2 ~ - alert("登录失败");
/ a8 y$ q! Q2 F1 f" t- z( Y0 v - }
% g3 d u0 o* }* C6 N - }. S c1 T7 T8 ]
- });1 H/ p' `% x1 Q6 _9 D! {
- ( ]* {, C1 }7 K
- }5 K' ]& j7 Z0 h) x+ Q8 ?: i! `3 f
- / O0 b! I: |; z- U4 T# B
- </script>
复制代码
5 n, s8 r# k* M( s页面展示:
2 k" Y+ U; S- M3 a
. D a8 A2 t0 i4 v
3 S3 S) b" s" y( P: s! v( ~) Q
0 i" B& k7 G. {. f
基于Sturts2实现一个简单的登录功能.txt
(64 Bytes, 下载次数: 2, 售价: 1 IT币)
9 Y9 z9 E! x* t. i0 X+ g3 b$ |
|
|