博客: https://www.cnblogs.com/youxiu326/p/shiro-01.html
github:https://github.com/youxiu326/sb_shiro_session.git
在原有基礎上添加 SimpleFormAuthenticationFilter
/**
* 自定義過濾器,ajax請求數據 以json格式返回
* Created by lihui on 2019/2/28.
*/
public class SimpleFormAuthenticationFilter extends FormAuthenticationFilter {
private static final Logger log = LoggerFactory.getLogger(SimpleFormAuthenticationFilter.class);
@Override
protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
if (isLoginRequest(request, response)) {
if (isLoginSubmission(request, response)) {
if (log.isTraceEnabled()) {
log.trace("Login submission detected. Attempting to execute login.");
}
return executeLogin(request, response);
} else {
if (log.isTraceEnabled()) {
log.trace("Login page view.");
}
return true;
}
} else {
HttpServletRequest httpRequest = WebUtils.toHttp(request);
if (isAjax(httpRequest)) {
HttpServletResponse httpServletResponse = WebUtils.toHttp(response);
httpServletResponse.sendError(401);
return false;
} else {
if (log.isTraceEnabled()) {
log.trace("Attempting to access a path which requires authentication. Forwarding to the " +
"Authentication url [" + getLoginUrl() + "]");
}
saveRequestAndRedirectToLogin(request, response);
}
return false;
}
}
/*
* 判斷ajax請求
* @param request
* @return
*/
boolean isAjax(HttpServletRequest request){
return (request.getHeader("X-Requested-With") != null && "XMLHttpRequest".equals( request.getHeader("X-Requested-With").toString()) ) ;
}
}


在ShiroConfig中添加一行
shiroFilterFactoryBean.getFilters().put("authc", new SimpleFormAuthenticationFilter());
login.html 修改
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org" >
<head>
<base th:href="${#httpServletRequest.getContextPath()+'/'}">
<meta charset="UTF-8">
<title>登錄頁面</title>
</head>
<body>
<h3>這是登錄頁面</h3>
<form action="loginAction">
編號:<input name="code"/>
<br/>
密碼:<input name="password"/>
<br/>
<input type="submit" value="登錄">
</form>
<br/>
<a href="logout" target="_blank">登出</a>
<br/>
<br/>
<br/>
<form action="register">
姓名:<input name="name"/>
<br/>
編號:<input name="code"/>
<br/>
密碼:<input name="password"/>
<br/>
<input type="submit" value="注冊">
</form>
<br/>
<a href="/to/add" target="_blank">去添加界面(admin角色可以訪問)</a>
<br/>
<a href="/to/update" target="_blank">去修改界面(admin角色可以訪問)</a>
<br/>
<a href="/to/list" target="_blank">去列表界面(admin和test 角色可以訪問)</a>
<br/>
<a href="/to/open" target="_blank">去開放界面(登錄了可以訪問)</a>
<br/>
<input style="margin-left: 300px;" type="button" onclick="callAjax()" value="測試發送ajax請求(登錄才可調用)"/>
</body>
<script src="/jquery-1.11.3.min.js"></script>
<script>
function callAjax(){
$.ajax({
type: 'POST',
url: "ajax",
data: {},
dataType: "json",
success: function(response){
alert(response);
console.log(response);
},
error:function(response){
alert(response.status);//自定義錯誤狀態碼 401
console.log(response.status);
}
});
}
</script>
</html>
沒有添加 SimpleFormAuthenticationFilter 之前
添加SimpleFormAuthenticationFilter 之后 返回了自定義錯誤狀態碼401

