我们知道,Solr是以webapp的形式运行的,那么我们只需要把Solr.war文件部署到web容器中,便可以运行了,但是因为需要连接数据库做索引并且提供线上的服务调用query接口,那么Solr的安全性是需要考虑的。因为Solr并没有自带Ip访问限制。那么我们需要自己来实现。
思路是将Solr导入到普通web project中,然后加上相应的类去实现Ip访问限制的功能。
我们将Solr.war解压后得到下列目录结构:
这本来就是一个web project 的目录结构,那么我们可以将这个目录导入到eclipse中,
步骤一:
在eclipse/myeclipse中新建普通web project。
步骤二:
将solr-4.9.0.war解压
步骤三:
将war文件解压后的目录中所有文件复制到eclipse项目中的webroot下:
步骤四:
修改web.xml文件中solrhome的路径。如果是在web容器中设置的话,就不需要执行这一步,具体参见博客:二、Solr安装(Tomcat)
<env-entry> <env-entry-name>solr/home</env-entry-name> <env-entry-value>D:/SolrIndex</env-entry-value> <env-entry-type>java.lang.String</env-entry-type> </env-entry>
步骤五:
添加jar包,除了Solr自带的jar包外,根据需要添加相应的jar文件,比如我就添加了Mysql的jdbc驱动和Spring
步骤六:
新建config source folder,用来放置相应的配置文件,不一定要建文件夹,只要保证相应的配置文件在部署后的class文件中即可。我新建文件夹是方便以后修改配置。
步骤七(关键):
这一步就是核心的一部,也就是IP限制和一系列功能的实现,在config中配置了允许访问的IP地址:
allows=127.0.0.1
然后新建一个类AccessFilter继承了Spring的filter,接收到一个访问请求后,根据请求的IP和配置文件中允许访问的IP对比,判断是否允许访问。
下面是doFilter方法:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 获取request和response HttpServletRequest servletRequest = (HttpServletRequest) request; HttpServletResponse servletResponse = (HttpServletResponse) response; String remoteAddr = servletRequest.getRemoteAddr(); //判断是否是允许的IP if(allow(remoteAddr)){ //允许访问 chain.doFilter(request, response); }else{ //不允许访问,返回错误信息 servletResponse.setStatus(HttpServletResponse.SC_FORBIDDEN); servletResponse.getWriter().print("403 Forbidden"); } }
最后附上项目的目录结构:
我的思路是将Solr转化成一个普通的eclipse web project,然后根据需求,往项目中添加相应的类,实现相应的功能,也就是在Solr外面再加了一层,把Solr集成到了web project中。