对springside4的研究:
项目是maven项目按照文档,进行项目环境的搭建,数据库数据也有。搭建完成后,就是代码的研读了。这个项目是后台使用的技术:spring+springmvc+jpa+shiro。
项目跑起来后,由于对shiro不是很了解,找了半天也没搞明白路径是怎么跳转的,web配置文件没有配置欢迎页但项目键入项目名字也跳转到了登录页,后来发现原来是shiro的问题,项目将所有请求路径都拦截下来了,统一有shiro权限系统管理,代码如下:
<span style="font-size:18px;"><span style="white-space:pre"> </span><filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
<param-name>targetFilterLifecycle</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>shiroFilter</filter-name></span>
<span style="font-size:18px;"><span style="white-space:pre"> </span>//拦截所有请求路径
<url-pattern>/*</url-pattern>
</filter-mapping></span>
下面是shiro权限拦截规则配置:
<span style="font-size:18px;"><span style="white-space:pre"> </span><bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager" /></span>
<span style="font-size:18px;"><span style="white-space:pre"> </span>//<span style="font-family:Consolas, Courier New, Courier, mono, serif;color:#008200;"><span style="line-height: 18px;">登录路径,相当于web配置文件中的欢迎页配置(暂时这样认识,目前还不是很清楚是不是这个)</span></span>
<property name="loginUrl" value="/login" /></span>
<span style="font-size:18px;"><span style="white-space:pre"> </span>//认证成功,跳转/路径
<property name="successUrl" value="/" />
<property name="filterChainDefinitions">
<value>
/login = authc
/logout = logout
/static/** = anon
/api/** = anon
/register/** = anon
/admin/** = roles[admin]
/** = user
</value>
</property>
</bean></span>
就此,我们就进入了springside4的登录页,下面我们研究下LoginController这个类。
<span style="font-size:18px;">@Controller
@RequestMapping(value = "/login")
public class LoginController {
@RequestMapping(method = RequestMethod.GET)
public String login() {
return "account/login";
}
@RequestMapping(method = RequestMethod.POST)
public String fail(@RequestParam(FormAuthenticationFilter.DEFAULT_USERNAME_PARAM) String userName, <span style="white-space:pre"> </span>Model model) {</span>
<span style="font-size:18px;">
model.addAttribute(FormAuthenticationFilter.DEFAULT_USERNAME_PARAM, userName);
return "account/login";
}
}</span>
这段代码让我对@requestMapping()这个注解更加理解了:
@requestMapping()这个注解里有6个属性可以配置,详情请点这里。其中常用的事value、method、params。这里让我知道了@requestMapping()不光可以将value映射成请求路径,而且可以将method对应的请求方式映射到对应的方法中,这真是一个收获。
由LoginController的代码可以看出,LoginController作用是打开login登录页面,由shiro配置文件配置的拦截规则可以看出,当认证不通过时返回login.jsp页面,当登录成功时,则请求路径变成 “/”
再看springmvc的配置文件:
<span style="font-size:14px; white-space: pre;"> </span><span style="font-size:18px;"><!-- 定义无需Controller的url<->view直接映射 -->
<mvc:view-controller path="/" view-name="redirect:/task"/></span>
可以看出“/”这样的请求路径被springmvc拦截后,会重定向到/task路径。