关于CAS服务端登录前ajax访问后台方法被拦截的配置

CAS 563 2017-09-20 14:53

前两天项目上使用的cas单点登录需要添加微信登录功能,与移动开发组的同事沟通后,发现需要在cas服务端添加二维码生成和对数据库相关操作的代码,在实现真正登录前,通过一定逻辑的ajax请求访问后台自定义的方法,实现二维码生成和相关数据库操作。

去年10月份研究了cas单点登录,目前已经实现了三个客户端+一台cas认证服务的统一门户功能,认证服务器支持个人用户名、身份证号、手机号和密码匹配验证,也支持法人用户名密码登录认证,先如今需要添加二维码扫码登录。研究cas由于知道其底层采用spring webflow结合spring mvc实现的,于是自己定义的方法也使用spring mvc注解的方式实现请求转发。下面按步骤进行配置:

1.在spring-configuration文件夹下添加springmvc-config.xml文件

  因为web.xml中默认配置的是加载spring-configuration路径下的所有xml(/WEB-INF/spring-configuration/*.xml),所以直接在spring-configuration下配置springmvc-config.xml文件。以下为配置内容:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- MVC注解驱动 -->
    <mvc:annotation-driven>
        <mvc:message-converters register-defaults="true">
            <!-- 将StringHttpMessageConverter的默认编码设为UTF-8 -->
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <constructor-arg value="UTF-8" />
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>
    
    <!-- 配置扫描器,使得@Controller注解生效 -->
    <context:component-scan base-package="com.casit" />
            
</beans>

2.在casLoginView.jsp中任意添加ajax用于访问后台的自定义类和方法


        $("#test").click(function(){
            $.ajax({
                url : "${ctx}/qRCodeOperation/erCodeLogin",
                dataType : "text",
                type : "get",
                success : function(data){
                    console.info(data);
                }
            });
        })

3.后台新增QRCodeOperation类和ERCodeLogin方法,由于使用spring JdbcDAOSupport类自带的JdbcTemplate方法,因此需要在applicationContext.xml中定义jdbcTemplate的bean并注入dataSource,并在使用类中通过spring属性注入的方式将jdbcTemplate实体注入。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/qRCodeOperation")
public class QRCodeOperation {
    
    @Autowired
    private JdbcTemplate jdbcTemplate;
    
    @RequestMapping("/erCodeLogin")
    @ResponseBody
    public String ERCodeLogin(){
        String usernm = jdbcTemplate.queryForObject("select usernm from sys_user where loginnm=?", String.class, "fagw" );
        System.out.println("usernm : " + usernm);
        return usernm;
    }
}

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">  
        <property name = "dataSource" ref="dataSource" />  
    </bean>

 4.由于cas对非法请求都会默认进行拦截,所以在web.xml中配置不拦截的地址栏(注意url-pattern中不能使用*代替,必须使用指定的url路径,我反正试了/qRCodeOperation/*没用)。

<servlet-mapping>
    <servlet-name>cas</servlet-name>
    <url-pattern>/qRCodeOperation/erCodeLogin</url-pattern>
  </servlet-mapping>

至此,就可以通过ajax访问到cas自定义的后台了。 

文章评论